Получить Dojo, как ждать двух одновременных асинхронных загрузок? - PullRequest
1 голос
/ 03 июня 2010

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Вы можете создать dojo.Deferreds для каждой выборки, а затем использовать dojo.DeferredList и добавить к нему deferreds - см. здесь . Это решение позволяет вам воспользоваться добавлением «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);
1 голос
/ 03 июня 2010
// 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();
});
...