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