我有这段代码:
$(function() {
(function poll(){
var update_progress = setTimeout(function(){
var jxhr = $.ajax({
type: "POST",
url: "grab.php",
data: "test",
success: function(data){
var error = data.error;
if(error == false) {
// My nonsense is here
} else if(error == true) {
// Stop sending AJAX request
clearTimeout(update_progress);
jxhr.abort();
}
}, dataType: "json", complete: poll, timeout: 2000 });
}, 2000);
})()
});
如你所见,如果我的脚本返回错误,我会再次尝试中止调用“complete:”回调,并且我也会清除超时。
所以基本上它不应再做任何ajax请求了。但它仍然如此。我错了什么?
答案 0 :(得分:1)
来自文档:
complete - A function to be called when the request finishes (after success and
error callbacks are executed).
因此,无论您在success
处理程序poll()
中执行什么操作,都会始终被调用。最简单的解决方案是
if(error == false) {
...
poll();
}
else {
//don't poll ;) and forget clearTimeout and abort as it's useless
更多的事情:我的错误你的脚本应该返回正确的Http状态代码(一些4xx或5xx)。然后,您可以将错误处理代码放入正确的error
处理程序而不是success
处理程序。
答案 1 :(得分:0)
我觉得这样的事情可能有用:
$(function() {
(function poll(){
var keepPolling = true;
var update_progress = setTimeout(function(){
var jxhr = $.ajax({
type: "POST",
url: "grab.php",
data: "test",
success: function(data){
var error = data.error;
if(error == false) {
// My nonsense is here
} else if(error == true) {
// Stop sending AJAX request
keepPolling = false;
}
}, dataType: "json", complete: function() {
if (keepPolling) {
poll();
}
}, timeout: 2000 });
}, 2000);
})()
});
基本上,如果要继续轮询,请有一个额外的var跟踪。将其默认为true,并在出现错误时设置为false。然后在完整方法中,检查是否要在实际再次调用poll之前保持轮询。
我不确定是先完成还是成功。如果首先调用complete,那么这将不起作用(尽管你可以在传递给setTimeout的函数顶部添加keepPolling检查)。