如何在$ .Deferred.then failFilter回调中执行异步操作并传回成功链?

时间:2016-02-25 02:21:11

标签: javascript jquery promise jquery-deferred

以下内容将在处理错误后将流程传递回成功链:

asyncThatWillFail().then(null, function () {
    //handle error
    return $.Deferred().resolve();
}).then(nextSuccessCallback);

在我的特定场景中,我需要使用$.when.apply($, promises)方法在错误处理程序中执行多个并行异步操作:

asyncThatWillFail().then(null, function () {
    var promises = [];
    for (var i = 0; i < 3; i++) {
        var dfd = $.Deferred();
        setTimeout(function () {
            dfd.resolve();
        }, 1000);
        promises.push(dfd.promise());
    }
    return $.when.apply($,promises);
}).then(nextSuccessCallback);

我认为上述工作会有效,因为我将返回最终解决的承诺。这个jsFiddle虽然表明在经过我的错误处理程序之后,都没有调用以下成功或错误回调。

由于错误处理程序中的操作是异步的,因此我无法继续并通过返回发送一些已解析的值。不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

现在你的问题是关闭......由于关闭

,只有3循环中最后创建的承诺才会被解决
asyncThatWillFail().then(null, function () {
    log("error handler");
    var promises = [];
    for (var i = 0; i < 3; i++) {
        (function() { // IIFE for a closure
            var dfd = $.Deferred();
            setTimeout(function () {
                dfd.resolve();
            }, 1000);
            promises.push(dfd.promise());
        }());
    }
    return $.when.apply(null,promises);
}).then(nextSuccessCallback, nextFailCallback);

function asyncThatWillFail () {
    var dfd = $.Deferred();
  setTimeout(function(){
      dfd.reject();
  }, 1000)
  return dfd.promise();
}

function nextSuccessCallback () {
    log("success");
}

function nextFailCallback () {
  log("failure");
}

function log (msg) {
    $("#logger").append("<p>"+msg+"</p>");
}

请参阅更新的fiddle