1

皆さん、私は非同期設計パターンの扱いに精通しておらず、2 つの非同期データ フェッチを行うスクリプトの作成に問題があります。

Dojo.data.api.Read.Fetch() を使用して、別々のデータベースから 2 つの fetch() 呼び出しを行っています。結果は非同期に返されます。ただし、結果を相互参照する必要があるため、両方の非同期フェッチが完了したらスクリプトを続行したいと考えています。これを行う方法がわかりません。そこに問題があります。

fetchのonCompleteフィールドとその使用方法認識していますが、最初の fetch の onComplete で 2 番目の fetch を呼び出すのが最善の解決策だと思います。これらのフェッチを同時に実行したいと思います。これを行う方法はありますか?

説明のために、私のプログラムの現在の構造を次に示します。

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

どんな助けでも大歓迎です!

4

2 に答える 2

2

フェッチごとに 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);
于 2010-06-07T11:02:08.357 に答える
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();
});
于 2010-06-03T15:59:39.813 に答える