中止调用“完成:”回调

时间:2014-01-10 20:02:08

标签: javascript jquery

我有这段代码:

    $(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请求了。但它仍然如此。我错了什么?

2 个答案:

答案 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检查)。