Existe-t-il un moyen de déclencher l’appel d’une méthode dans un autre module qui «pourrait» exister?

Je sais que c’est une question fondamentale … mais je vais essayer de vous expliquer.

J’ai utilisé un différé, mais quelqu’un a fait remarquer que je l’utilise comme anti-motif. En gros, je peux utiliser le différé dans le module enfant. MAIS s’il s’agit d’un anti-motif, quel est le meilleur moyen d’y parvenir, dans lequel le “module enfant” pourrait ne pas exister … SO, je ne veux pas appeler explicitement la méthode enfant dans le succès du parent ajax appel.

Donc, trois questions:

  1. Est-ce un moyen viable, sinon – quel est un bon moyen de réaliser ce que je veux?

  2. Même si je réinitialise le différé, il ne semble pas «réinitialiser». Pourquoi?

  3. Cela peut également être réalisé en le couplant à un autre événement – à savoir, en charge. SO <nous avons le ajax AND onload qui fait la même chose.

J’ai un module parent.

var Z = {}; Z.someVar = $.Deferred(); Za = function(){ //methods //Ajax call on page: can be once or multiple calls. $AJAX = { url:..., dataType: ..., //etc.. }.success( function(){ Z.someVar.resolve(); } ).error(); }; // another method that MIGHT exist. Zb = function(){ var func1 = function(){ // do some stuff Z.someVar = $.Deferred(); // reset it. } Z.someVar.done(function(){ func1(); }) } 

Une promesse est une abstraction basée sur un calcul unique et ponctuel d’une valeur. Une promesse commence en attente , puis peut basculer vers un état rempli ou rejeté . Une fois qu’une promesse est résolue (en transition), elle ne peut plus jamais changer d’état.

Les différés sont utilisés dans exactement un cas – lorsque vous voulez construire une promesse à partir de quelque chose qui n’est pas une promesse *.

Dans jQuery, $.ajax retourne déjà une promesse.

 Za = function(){ // this method now returns a promise return $.ajax({...}); }; 

Si nous voulons l’enchaîner, nous pouvons utiliser .then :

 Za().then(function(){ // here a() is done. }); 

Vous pouvez également utiliser un modèle de mise en cache en utilisant $.when .when (Promise.resolve dans la plupart des bibliothèques de promesses):

 Z._a = null; Za = function(){ if(z._a){ // already have the value cached: return $.when(z._a); // promise over the value } return $.ajax({...}).then(function(res){ Z._a = res; return res; // chain }); }; Zb = function(){ return Za().then(function(aValue){ // do something with value, your return value here is the resolution // value of the a method call. }); } 

Maintenant, si vous voulez attendre plusieurs appels, vous pouvez utiliser $.when avec plusieurs promesses et obtenir leurs résultats.

Il existe d’autres cas d’utilisation très rares avec agrégation