jQuery Deferred, $ .when () и аргументы обратного вызова fail ()

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

Как мне узнать, какие отсрочки оказались неудачными, и какие аргументы отклонения принадлежат какому-то неудачному отсроченному, если порядок аргументов в обратном вызове не соблюдается?

23
задан Paul D. Waite 20 May 2014 в 09:06
поделиться