Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 等待AJAX完成后再继续_Jquery_Ajax_Loaded - Fatal编程技术网

Jquery 等待AJAX完成后再继续

Jquery 等待AJAX完成后再继续,jquery,ajax,loaded,Jquery,Ajax,Loaded,我已经寻找了一些AJAX线程来寻找我的问题,但是我没有找到解决我的问题的方法。事情是这样的: 我有一个用户评论页面。这些注释保存在数据库中,每次用户按下“刷新”按钮时,都会连接到数据库,从而得到相应的注释。如果有任何新消息,则会有一个div“there are uu new messages”。但是,最后一条消息永远不会正确显示,因为它出现在加载消息之前 代码如下: AJAX函数 function GetComments() { $("#cont-comment").empty(); /

我已经寻找了一些AJAX线程来寻找我的问题,但是我没有找到解决我的问题的方法。事情是这样的:

我有一个用户评论页面。这些注释保存在数据库中,每次用户按下“刷新”按钮时,都会连接到数据库,从而得到相应的注释。如果有任何新消息,则会有一个div“there are uu new messages”。但是,最后一条消息永远不会正确显示,因为它出现在加载消息之前

代码如下:

AJAX函数

function GetComments()
{
    $("#cont-comment").empty(); //div that contains the messages
    $.ajax(
    {
        url: "get.php",
        dataType: "json",
        success: function(data)
        {
            n_msg=data.length;
            for (i=0; i<n_msg; i++)
            {
                nick=data[i].nick;
                msg=data[i].msg;
                WriteNewComment(nick,msg);
                num_comments=document.getElementsByClassName("comment-msg").length;
            }
        } 
    });
}
“完成”消息出现在新注释之前。我希望消息“done”只在新评论出现时出现—当AJAX完成时。

如果您添加:

异步:false

对于ajax调用,javascript将等待ajax函数返回(成功或错误),然后继续


因为ajax是一个异步调用,所以浏览器会在您进行ajax调用并继续其流时生成一个线程,这就是为什么您的“完成”消息会出现在新注释之前。理想情况下,您不应该阻止您的代码,除非它是一个强烈要求

您可以在回调中调用alert('done')函数,如下所示

 function GetComments(alertFunction)
{
    $("#cont-comment").empty(); //div that contains the messages
    $.ajax(
    {
        url: "get.php",
        dataType: "json",
        success: function(data)
        {
            n_msg=data.length;
            for (i=0; i<n_msg; i++)
            {
                nick=data[i].nick;
                msg=data[i].msg;
                WriteNewComment(nick,msg);
                num_comments=document.getElementsByClassName("comment-msg").length;
            }

          **alertFunction();**
        } 
    });
}



$("#refresh").click(function()
{
    num_comments_before=num_comments;
    GetComments(alertFunction);

});

function alertFunction(){
  alert("done");
}
函数GetComments(alertFunction)
{
$(“#cont comment”).empty();//包含消息的div
$.ajax(
{
url:“get.php”,
数据类型:“json”,
成功:功能(数据)
{
n_msg=data.length;

对于(i=0;i尽管jQuery没有正确地遵守,但是
$.ajax()
方法返回一个可用于处理响应逻辑的值。下面是一种工作方式:

$.when(getComments).then(processComments);

function getComments() {
    $("#cont-comment").empty();
    return $.ajax({
        url: "get.php",
        dataType: "json",

    });
}

function processComments(data) {
    n_msg=data.length;
    for (i=0; i<n_msg; i++) {
        nick=data[i].nick;
        msg=data[i].msg;
        WriteNewComment(nick,msg);
        num_comments=document.getElementsByClassName("comment-msg").length;
    }
    alert("done");
}
$.when(getComments)。然后(processComments);
函数getComments(){
$(“#cont comment”).empty();
返回$.ajax({
url:“get.php”,
数据类型:“json”,
});
}
函数processComments(数据){
n_msg=data.length;

对于(i=0;i上述注释是正确的。您需要在回调中进行更新。对代码进行一些调用。您应该始终
var
您的变量。在javascript中,不这样做会将变量添加到全局范围(这很糟糕!)。此外,最好使用K&R样式的大括号(在同一行上打开,而不是在新行上打开)因为使用Allman样式有时会导致问题

如果您想使用更现代的方法,那么我建议对ajax调用使用jquery
$.when
.done()

$.when(GetComments()).done(function(data){
  var n_msg = data.length, i=0, nick, msg, num_comments=0;
  n_msg = data.length;
  for (; i<n_msg; i++) {
    nick = data[i].nick;
    msg = data[i].msg;
    WriteNewComment(nick,msg);
    num_comments=document.getElementsByClassName("comment-msg").length;
  }
  alert('done');
});
$.when(GetComments()).done(函数(数据){
var n_msg=data.length,i=0,nick,msg,num_comments=0;
n_msg=data.length;

对于(;异步的使用已被弃用和劝阻,相反,应该使用回调。这很有效,谢谢!巴拉,我也很感谢你的回答。当我运行完之后,我将使用你的选项。非常感谢。这是链接到
$上的jquery api文档。When
:谢谢!我对$一无所知。When.看起来像是grea我也很欣赏你关于变量(我知道,我的错)和大括号的技巧。
$.when(GetComments()).done(function(data){
  var n_msg = data.length, i=0, nick, msg, num_comments=0;
  n_msg = data.length;
  for (; i<n_msg; i++) {
    nick = data[i].nick;
    msg = data[i].msg;
    WriteNewComment(nick,msg);
    num_comments=document.getElementsByClassName("comment-msg").length;
  }
  alert('done');
});