1

我正面临 Deferrent 以及如何在这种特定情况下使用它的问题。

情景如下。

我有一个循环,我将一些数据发送到服务器。例如:

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 函数中并使用 $.then 来返回 $.post。但我没有达到我所希望的。

4

1 回答 1

2

您不应该使用循环 - 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();
}
于 2012-10-18T09:39:52.070 回答