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