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