Получить все отклонения множественного асинхронного вызова с помощью jQuery

#javascript #jquery #asynchronous

#javascript #jquery #асинхронный

Вопрос:

Всем доброго дня,

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

 $(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:

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

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

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

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