我已经阅读了很多关于此的帖子,但仍无法解决我的问题。我看过jQuery.when但不知道如何使用它。我通过ajax从服务器获取数据,然后更新页面。有时,可能需要几秒钟,具体取决于返回的数据量。我不希望运行相同的ajax函数,直到所有html都加载到页面上。这可能吗?
我有一个计时器来运行一个调用ajax请求的函数。
setInterval( "update()", 25000 );
这是更新功能中的ajax
$.ajax({
type: "POST",
url: "/ajax/modify.php",
data: "id="+ id +"& action="+ act,
success: function(response){
//update the html on the page
}
});
用户可以通过点击链接获得更多帖子。问题是,如果他们点击该链接以获得更多帖子并且计时器恰好发生,它会刷新页面并中断用户请求并使用之前的内容重新加载div容器。所以我需要它等到响应完成并且页面已经更新,然后才允许更多请求。
值得赞赏的一个例子。
答案 0 :(得分:3)
JQuery的ajax方法返回一个promise,您可以使用它来附加回调。您可以将此承诺存储到变量中。在功能成功/失败时,您可以清除变量。这样您就知道请求当前是否处于活动状态。只需确保变量在函数范围之外,否则它将无法帮助您。例如:
var currentRequest = null;
function doUpdate() {
// don't do anything if there's an active request
if (currentRequest)
return;
currentRequest = $.ajax({
type: "POST",
url: "/ajax/modify.php",
data: "id="+ id +"& action="+ act
}).then(function(response) {
// do your UI updates here.
}).always(function() {
// whether the call succeeds or not, still clear out the request
// so that the next call into the function makes a new request
currentRequest = null;
});
}
答案 1 :(得分:0)
看看这个问题jQuery deferreds and promises - .then() vs .done()
执行async:false
会破坏它的目的,你可以在第一个成功回调中触发下一个ajax请求,但这不是一个干净的方法IMO