2010-06-03 3 views
1

Hé les gars, je ne suis pas très versé dans le traitement des modèles de conception asynchrones, et j'ai un problème pour écrire un script qui effectue deux extractions de données asynchrones.Dojo fetch, comment attendre sur deux fetchs asynchrones simultanés?

J'utilise Dojo.data.api.Read.Fetch() pour effectuer deux appels fetch() à partir de bases de données distinctes. Les reulsts reviennent de manière asynchrone. Cependant, je dois recouper les résultats, donc je veux que mon script continue une FOIS QUE les deux extractions asynchrones sont terminées. Je ne sais pas comment faire cela, et c'est là que réside le problème.

Je suis conscient du champ de chercher onComplete et comment l'utiliser, mais la meilleure solution de cas, je vois qu'il est d'appeler le second dans le onComplete d'extraction de la première extraction. Je voudrais faire ces extractions en même temps. Y a-t-il un moyen de faire cela?

est ici la structure actuelle de mon programme à des fins d'illustration:

this.dict1.fetch({query:"blahblahblah", onComplete: function(items) { something here? }});
this.dict2.fetch({query:"blahblahbleh", onComplete: function(items) { or maybe something here? }});
this.orMaybeDoSomethingAfterBothFetches()

Toute aide serait grandement appréciée!

Répondre

1
// this is a variation of a function I have answered quite a few similar questions on SO with 
function collected(count, fn){ 
    var loaded = 0; 
    var collectedItems = []; 
    return function(items){ 
     collectedItems = collectedItems.concat(items); 
     if (++loaded === count){ 
      fn(collectedItems); 
     } 
    } 
} 

var collectedFn = collected(2, function(items){ 
    //do stuff 
}); 


this.dict1.fetch({query:"blahblahblah", onComplete: collectedFn); 
this.dict2.fetch({query:"blahblahbleh", onComplete: collectedFn); 

Une solution alternative est

var store = { 
    exec: function(){ 
     if (this.items1 && this.items2) { 
      // do stuff with this.items1 and this.items2 
     } 
    } 
}; 

this.dict1.fetch({query:"blahblahblah", onComplete: function(items) { 
    store.items1 = items; 
    store.exec(); 
}); 
this.dict2.fetch({query:"blahblahbleh", onComplete: function(items) { 
    store.items2 = items; 
    store.exec(); 
}); 
+0

J'aime, j'aime. – Dfowj

2

Vous pouvez créer dojo.Deferreds pour chacun des récupérations puis utilisez dojo.DeferredList et ajoutez les deferreds à lui - voir here. Cette solution vous permet de profiter de l'ajout de fonctions «n» à la liste des fonctions que vous souhaitez appeler. Il tire également parti de toutes les fonctions de callback et d'errBack de dojo.Deferred.

var fetch1 = new dojo.Deferred(); 
fetch1.addCallback(this.dict1.fetch...); 
var fetch2 = new dojo.Deferred(); 
fetch2.addCallback(this.dict2.fetch...); 

var allFuncs = new dojo.DeferredList([fetch1, fetch2]); 
var doStuffWhenAllFuncsReturn = function() {...}; 
allFuncs.addCallback(doStuffWhenAllFuncsReturn); 
+0

Une chose que je ne comprends pas à ce sujet est l'utilisation de la fetch comme valeur pour appeler le constructeur différé sur .. N'est-ce pas l'annuleur? Vous voulez expliquer comment cela fonctionne? – Dfowj

+0

Vous avez raison - voir le code corrigé ci-dessus. On dirait que l'API a été modifiée en 1.5, donc vous devriez regarder toutes les nouvelles API basées sur les promesses et dojo.when. – Andy