2010-06-03 3 views
1

Эй, ребята, я не очень разбираюсь в асинхронных шаблонах дизайна, и им не удалось написать сценарий, который выполняет две асинхронные выборки данных.Dojo fetch, как подождать на двух одновременных асинхронных выборках?

Im, используя Dojo.data.api.Read.Fetch(), чтобы сделать два вызова fetch() из отдельных баз данных. Повторные действия возвращаются асинхронно. Тем не менее, мне нужно перекрестно ссылаться на результаты, поэтому я хочу, чтобы мой скрипт продолжался, как только BOTH асинхронные выборки завершены. Я не знаю, как это сделать, и в этом проблема.

Я я известно о поле OnComplete выборки и как использовать его, но в лучшем случае решение я вижу, чтобы вызвать вторую выборку в OnComplete из первой выборки. Я хотел бы сделать эти выборки в то же время. Есть ли способ сделать это?

Вот текущая структура моей программы для иллюстрации:

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

Любая помощь будет принята с благодарностью!

ответ

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); 

Альтернативным решением является

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

Мне нравится, мне нравится. – Dfowj

2

Вы можете создать dojo.Deferreds для каждой из выборок, а затем использовать dojo.DeferredList и добавьте deferreds к нему - см here. Это решение позволяет вам воспользоваться добавлением функций «n» в список функций, которые вы хотите вызвать. Он также использует все функции обратного вызова dojo.Deferred и errBack.

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

Одна вещь, которую я не понимаю об этом, - это использование fetch как значения для вызова конструктора отложенных объектов. Разве это не отмена? Позаботьтесь, чтобы объяснить, как это работает? – Dfowj

+0

Вы верны - см. Исправленный код выше. Похоже, что API изменился в 1.5, чтобы вы могли посмотреть на все новые API, основанные на обещаниях, и dojo.when. – Andy