0
votes

Comment gérer les appels imbriqués en $ .Deferred

Je gère plusieurs appels imbriqués à l'aide de JQuery's $. Fonction différée code>. Actuellement, le code ne fonctionne pas correctement. Je veux déclencher une fonction lorsque toutes les demandes sont terminées. Mais actuellement après deux demandes, il atteint la console.log code>.

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


0 commentaires

3 Réponses :


-1
votes

Une seule promesse peut être résolue ou rejetée une seule fois. Vous devez retourner différentes promesses d'avoir toutes les promesses résolues. Quelque chose comme ceci: xxx

Un meilleur moyen de le faire serait d'utiliser des observables (exemple: rxjs)

Vous pouvez également faire appel à cette réponse pour comprendre la difference entre les pomises et observables: https://stackoverflow.com/a/37365955/6080889


2 commentaires

Malheureusement, je ne suis pas croire l'extrait ci-dessus va fonctionner. Parce qu'un Single différé est utilisé pour les deux itérations via la boucle ( DFD ), les deux promesses dans le tableau AllPromises n'atteint jamais un "résolu" Etat et donc le promess.all ne résoudra pas. Je pourrais avoir tort, mais j'ai essayé de le tirer dans un extrait avec des fonctions asynchrones simulées modifiées et qui semblait être le cas.


@Alexandernied merci d'avoir souligné cela. C'était un problème d'étendue utilisant var . J'ai mis à jour ma réponse pour initialiser dfd en utilisant laisse .



0
votes

Le problème que vous avez est que vous définissez finalement, résoudre et retourner un Single em> différé, même si votre boucle indique que vous avez l'intention de suivre plusieurs differts. Pour que l'exemple de fonctionne, j'ai inclus une mock asynceventer code> la fonction tirée de la documentation de jQuery. Voir l'extrait ci-dessous pour voir tout fonctionner comme prévu:

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


1 commentaires

@DavidBray - Cela peut être vrai, j'essayais simplement de répondre à la question spécifique de l'utilisateur concernant l'objet de jQuery différé. Compte tenu de l'utilisation fréquente de var et cette question étant une question spécifique à la jQuery, il est possible que l'OP est dans un scénario dans lequel ils doivent prendre en charge les navigateurs plus anciens qui Ne supporte pas les promesses, comme IE .



-1
votes

Vous pouvez essayer ceci:

Vous devez passer par ce lien: Utilisation de plusieurs promesses différées - JavaScript / JQuery P>

var callAPI=function(){
const promise = new Promise((resolve, reject) => {
         var api = require('modules/api');
         resolve(api.request("GET","https://t25501-s39032.sandbox.mozu.com/events/priceadjustment"));
  });
return promise;
}    


function getInfo(){
    const promise = new Promise((resolve, reject) => {
            var allPromise=[];
            for(var i=0;i<2;i++){
                  allPromises.push(callAPI());
            }
                  return Promise.all(allPromises);
     });
return promise;
}

getInfo().then((result)=>{
       console.log("reached",result);
});


4 commentaires

laissez le bal + i = $ .Deferred (); ce n'est pas valide que les noms de variable Syntax- JS ne peuvent pas être modifiés / générés de manière dynamique de cette manière en dehors de l'utilisation de certains espaces de noms globaux (c'est-à-dire les définir comme des propriétés sur la fenêtre objet).


Salut @ alexandinied édité


Bonjour Shubham - Malheureusement, ce code a toujours des problèmes. La principale que je vois, c'est que vous retournez le promess.Tous la première fois que vous passez par la boucle, il ne sera donc jamais itérer.


Ohhhhh;) @Alexandernied, c'est par erreur. Merci