3 votes

Obtenir tous les rejets d'un appel asynchrone multiple avec jQuery

Bonjour à tous,

J'ai besoin de faire plusieurs appels asynchrones et, si certains échouent, d'obtenir lequel ou lesquels ont échoué et leur message d'erreur. Pour cela, j'ai le code suivant :

$(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));
  });

});

Voici le JSFiddle avec ce code : https://jsfiddle.net/bjyfhave/8/

Dans jQ, la fonction de rappel dans .done() a les valeurs résolues comme paramètres (v1, v2, v3). Si vous remplacez le dfd.reject par .resolve en async2 y async3 il fonctionne très bien.

J'ai suivi la même logique pour le .fail() et je m'attendais à ce résultat :

(v1 null)23

Mais à la place, j'obtiens :

3(v2 null)(v3 null)

Ce qui signifie que j'obtiens le dernier rejet comme 1er argument et que les autres sont perdus.

Je n'ai pas trouvé d'exemples concrets de cette situation, ce qui m'amène à poser la question suivante :

Comment obtenir tous les rejets de plusieurs méthodes asynchrones exécutées simultanément ?

Merci pour votre aide.

1voto

Matt Way Points 4301

La raison pour laquelle vous obtenez ce résultat 3(v2 null)(v3 null) c'est parce que fail() est appelé dès qu'une promesse de la liste échoue. Cela signifie que si async3() échoue d'abord, puis .fail() sera appelé, et 3 sera le seul argument passé au callback.

Juste pour reformuler, fail() ne reçoit pas le résultat de tous des promesses, juste le premier rejet.

Comment obtenir tous les rejets de plusieurs méthodes asynchrones exécutées simultanément ?

La difficulté ici est que le résultat attendu semble être synchrone (résultat de A, puis B, puis C). Si l'ordre n'a pas d'importance, il suffit d'exécuter séparément les commandes .done() pour chacun d'entre eux, et d'imprimer le résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X