Получите все отклонения многократного асинхронного вызова с jQuery - PullRequest
3 голосов
/ 13 марта 2019

Добрый день всем,

Мне нужно сделать несколько асинхронных вызовов и, в случае сбоя, узнать, какие из них сделали, и их сообщение об ошибке. Для этого у меня есть следующий код:

$(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-го аргумента, а остальные потеряны.

Мне не удалось найти какие-либо рабочие примеры этой ситуации, что приводит к моему вопросу:

Как заставить все отклонения нескольких асинхронных методов работать одновременно?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 13 марта 2019

Причина, по которой вы получаете результат 3(v2 null)(v3 null), заключается в том, что fail() вызывается, как только любое обещание в списке не выполняется.Это означает, что если сначала произойдет сбой async3(), то будет вызван .fail(), и 3 будет единственным аргументом, переданным обратному вызову.

Просто для повторения, fail() не получит результатиз всех обещаний, только первое отклонение.

Как получить все отклонения нескольких асинхронных методов, запущенных одновременно?

Ну, сложность здесьчто ваш ожидаемый результат кажется синхронным (результат A, затем B, затем C).Если порядок не имеет значения, вы можете просто запустить отдельные функции .done() для каждой и распечатать результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...