Я получаю неожиданный результат при использовании $. 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/
Я получаю неудачно! f1, f2: ["456 from f2", null]
Проблема в том, что в обратном вызове .fail ()
значение, переданное с отклонением f2 ()
, является направляется к первому аргументу, где я ожидаю f1Value
. Это означает, что у меня действительно нет способа узнать, какой отложенный объект на самом деле опубликовал этот reject ()
, и я также не знаю, к какой операции на самом деле принадлежат эти данные об ошибке.
Я ожидал что .fail ()
получит аргументы null, '456 from f2'
так как первая отложенная ошибка не завершилась. Или я просто не выполняю отсрочки правильно?
Как мне узнать, какие отсрочки оказались неудачными, и какие аргументы отклонения принадлежат какому-то неудачному отсроченному, если порядок аргументов в обратном вызове не соблюдается?