Я получаю неожиданный результат при использовании $.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'
, так как первая отложенная не потерпела неудачу. Или я просто не правильно делаю отсрочку здесь?
Как я могу узнать, какие отложенные сбои и какие аргументы отклонения принадлежат тому, с каким сбоем отложенного, если порядок аргументов в обратном вызове не соблюден?