jQueryAjax:等到第一次调用结束,再发送另一个请求$.Deferrent

jQueryAjax:等到第一次调用结束,再发送另一个请求$.Deferrent,jquery,jquery-deferred,Jquery,Jquery Deferred,我面临一个延期的问题,以及如何在这个具体案例中使用它 情况如下 我有一个向服务器发送数据的循环。例如: var array = [{"effect":"save","params":["login_0_form_form_login"],"url":"http://www.example.local/login"},{"effect":"redirect","params":["index"],"url":"http://www.example.local/index"}]; $.each(a

我面临一个延期的问题,以及如何在这个具体案例中使用它

情况如下

我有一个向服务器发送数据的循环。例如:

var array = [{"effect":"save","params":["login_0_form_form_login"],"url":"http://www.example.local/login"},{"effect":"redirect","params":["index"],"url":"http://www.example.local/index"}];

$.each(array,function(key,payload) {

 $.post(payload.url,payload);

});
然后是处理ajax调用结果的成功方法

App.success = function(result){
   //Here I am deciding what to do with the result and checking for errors or warnings

   if(result.notification.success) {
      //Everything is good
   }
   else if(result.notification.error) {
      //Something is wrong, somehow stop the other ajax call  
   }
}
尽管如此,我面临的问题是,服务器可能返回错误,例如,错误的登录数据。在这种情况下,尽管服务器返回了错误的登录数据,但它会重定向。我需要以某种方式控制前一个请求是否返回错误。如果是,请不要跟随张贴


我尝试在$.when函数中返回$.post,并使用$.then。但是我没有达到我的期望。

您不应该使用循环-AJAX调用将立即(并行)启动,而不是一次运行一个

我将使用一个递归回调循环依次处理每个操作,并结合一个单独的
$。Deferred
对象来通知您发生了什么:

function processActions(actions) {
    var def = $.Deferred();

    (function nextAction() {
        var action = actions.shift();  // dequeue the next action
        if (action) {
            $.ajax(...).done(nextAction).fail(function() {
                def.reject();  // there was an error
            });
        } else {
            def.resolve();     // all done
        }
    })();  // invoke this function immediately

    return def.promise();
}

好主意。我要试试这个。非常感谢。如果我在成功方法中检查服务器返回的数据验证错误,我也应该拒绝延迟验证,对吗?@Coron3r如果有数据验证错误,您的web服务器应该返回
5xx
4xx
状态代码,从而触发
.fail()
路径。。。(正确设计的RESTful服务不会返回
2xx
响应“错误”代码)