Добрый день всем,
Мне нужно сделать несколько асинхронных вызовов и, в случае сбоя, узнать, какие из них сделали, и их сообщение об ошибке. Для этого у меня есть следующий код:
$(function () {
function async1() {
var dfd = $.Deferred();
dfd.resolve('1');
return dfd.promise();
}
function async2() {
var dfd = $.Deferred();
dfd.reject('2');
return dfd.promise();
}
function async3() {
var dfd = $.Deferred();
dfd.reject('3');
return dfd.promise();
}
function buildMessage(v1, v2, v3) {
var msg = v1 != null ? v1 : "(v1 null)";
msg += v2 != null ? v2 : "(v2 null)";
msg += v3 != null ? v3 : "(v3 null)";
return msg;
}
var d1 = async1();
var d2 = async2();
var d3 = async3();
$.when(d1, d2, d3).done(function (v1, v2, v3) {
$('#done').html(buildMessage(v1, v2, v3));
}).fail(function (v1, v2, v3) {
$('#fail').html(buildMessage(v1, v2, v3));
});
});
Вот JSFiddle с этим кодом: https://jsfiddle.net/bjyfhave/8/
В jQ функция обратного вызова в .done()
имеет разрешенные значения в качестве параметров (v1, v2, v3). Если вы замените dfd.reject
на .resolve
в async2
и async3
, это прекрасно работает.
Я следовал той же логике для .fail()
и ожидал такого результата:
(v1 null)23
Но вместо этого я получаю:
3(v2 null)(v3 null)
Это означает, что я получаю последнее отклонение в качестве 1-го аргумента, а остальные потеряны.
Мне не удалось найти какие-либо рабочие примеры этой ситуации, что приводит к моему вопросу:
Как заставить все отклонения нескольких асинхронных методов работать одновременно?
Спасибо за вашу помощь.