如何在 $.Deferred.then failFilter 回调中执行异步操作并传回成功链?
How can I perform an async operation in $.Deferred.then failFilter callback and pass back to success chain?
以下将在处理错误后将流传回成功链:
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);
我曾假设以上内容会奏效,因为我return承诺最终会得到解决。这个 jsFiddle 虽然表明在通过我的错误处理程序之后,没有调用以下成功或错误回调。
由于错误处理程序中的操作是异步的,我不能直接通过 return 发送一些已解决的值。不知道从这里去哪里。
您现在的问题是闭包……只有循环 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
以下将在处理错误后将流传回成功链:
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);
我曾假设以上内容会奏效,因为我return承诺最终会得到解决。这个 jsFiddle 虽然表明在通过我的错误处理程序之后,没有调用以下成功或错误回调。
由于错误处理程序中的操作是异步的,我不能直接通过 return 发送一些已解决的值。不知道从这里去哪里。
您现在的问题是闭包……只有循环 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