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

标签 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);

我原以为上述内容会起作用,因为我正在返回最终会得到解决的 promise 。这个jsFiddle但显示在执行我的错误处理程序后,不会调用以下成功或错误回调。

由于错误处理程序中的操作是异步的,我不能直接通过返回发送一些已解析的值。不知道从这里去哪里。

最佳答案

你现在的问题是闭包……只有 3 循环中最后创建的 Promise 才会由于闭包而得到解决

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

关于javascript - 如何在 $.Deferred.then failedFilter 回调中执行异步操作并传回成功链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617052/

相关文章:

javascript - 为什么 vscode 不将 react 代码识别为 react javascript 而是将其格式化为 vanilla javascript

javascript - 如何模拟服务器?

javascript - 即使删除只读后也无法使 TextArea 可编辑 : Html

asp.net - 检测所有 HTML 页面渲染何时发生

javascript - Rails 表单 - 通过 JavaScript 根据另一个选定选项更改选择选项

javascript - 通过更改事件调用方法时主干集合为空

javascript - 使用 jQuery 的动态 AJAX promise 链

javascript - 在 promise 中打开窗口

javascript - Angularjs $http 等待响应

javascript - 创建 jquery 扩展。范围问题