当使用$.when()
时,如果其中一个延迟操作不成功,我会得到意外的结果。
考虑这段JavaScript代码,它创建了2个延迟(deferred)对象。第一个执行成功,而第二个执行失败。
var f1 = function() {
return $.Deferred(function(dfd) {
dfd.resolve('123 from f1');
}).promise();
};
var f2 = function() {
return $.Deferred(function(dfd) {
dfd.reject('456 from f2');
}).promise();
};
$.when(f1(), f2())
.then(function(f1Val, f2Val) {
alert('success! f1, f2: ' + JSON.stringify([f1Val, f2Val]));
})
.fail(function(f1Val, f2Val) {
alert('fail! f1, f2: ' + JSON.stringify([f1Val, f2Val]));
});
请自行运行代码: http://jsfiddle.net/r2d3j/2/
我得到了fail! f1, f2: ["456 from f2", null]
问题在于,在.fail()
回调中,与f2()
拒绝一起传递的值被路由到第一个参数中,而我期望的是f1Value
。这意味着我实际上没有办法知道哪个延迟对象实际上发布了那个reject()
,我也不知道该故障数据属于哪个操作。
我本来希望.fail()
会得到参数null,'456 from f2'
,因为第一个延迟没有失败。或者我在这里使用延迟的方式不正确吗?
如果回调中的参数顺序不被尊重,我怎样才能知道哪些延迟失败,并且哪些拒绝参数属于哪个失败的延迟?
\-:
- hippietrailPromise.allSettled
,检查我的答案。 - João Pimentel Ferreira