如何在for循环中等待一个,直到ajax调用完成


How to wait a in a for loop until ajax call finishes

我是开发网站的新手,我正在开发一个小型网站。在这里,我使用ajax来显示新的评论。这是我写的函数

function show_comments() {
$('div#P_all_posts>div').each(function () {
    id = this.id.replace("post", "");
    $.ajax({
        url: 'http://localhost/seppro/index.php/group/show_comments',
        type: 'post',
        data: {
            id: id
        },
        success: function (data) {
           document.getElementById("cmnt"+id).innerHTML=data;
        },
        error: function (err, req) {
            alert(err)
        },
        async: false
    });
});
setTimeout("show_comments()", 5000);
}

PHP

型号

public function showcmnts(){ 
    $sql="select * from tbl_cmnt 
          where postid='".$this->input->post("id")."'"; 
    $query = $this->db->query($sql); return $query->result(); 
}

控制器

 public function show_comments(){
    $data['cmntlist'] = $this->Group_model->showcmnts();
    $this->load->view('group/grp_cmnts', $data);
}

查看

foreach ($cmntlist as $cmnt):
echo $cmnt->comment . "<br>";
endforeach;

即使我在ajax成功函数中设置了async: false,我也只能获得ajax成功函数内的最后一个id(最后一个div的id)。但是,当我提醒ajax部分上方的id(div的id)时,我得到了正确的id。那么我如何才能暂停循环直到ajax函数结束。很抱歉我的英语不好,请帮助我

尝试将ajax调用包装为立即调用的函数,并将id传递给它:

    $('div#P_all_posts>div').each(function () {
        id = this.id.replace("post", "");
        (function(id) {
            $.ajax({
                url: 'http://localhost/seppro/index.php/group/show_comments',
                type: 'post',
                data: {
                    id: id
                },
                success: function (data) {
                    document.getElementById("cmnt" + id).innerHTML = data;
                },
                error: function (err, req) {
                    alert(err)
                },
                async: false
            });
        })(id)
    });

看起来您的idvar是全局的,在每个循环中它都会重写其值,当ajax完成时,id等于循环中的最后一个值。

错误似乎是您从未在脚本中第一次调用函数show_comments()

  1. 我建议你在称之为时使用它

    setInterval(show_comments(),5000)

并从show_comments() 中删除setTimeOut()

  1. 或者,您可以只保留setTimeOut()并在脚本路径或要调用它的函数中调用show_comments()