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