$.when()
当其中一个延迟操作不成功时使用时,我得到了意想不到的结果。
以这个 JavaScript 为例,它创建了 2 个延迟。第一个成功,第二个失败。
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'
,因为第一个 deferred 没有失败。或者我只是没有在这里做正确的延期?
如果不遵守回调中的参数顺序,我如何知道哪些延迟失败,哪些拒绝参数属于哪个失败的延迟?