Dojo提取,如何等待两个同步异步提取?

时间:2010-06-03 15:49:13

标签: javascript asynchronous dojo fetch

嘿伙计们,我并不精通处理异步设计模式,并且我在编写执行两次异步数据提取的脚本时遇到问题。

我使用Dojo.data.api.Read.Fetch()从单独的数据库进行两次fetch()调用。 reulsts以异步方式返回。但是,我必须交叉引用结果,所以我希望我的脚本在完成异步提取后继续。我不知道该怎么做,其中存在问题。

知道fetch的 onComplete 字段以及如何使用它,但最好的情况解决方案我看到在onComplete中调用第二个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()

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您可以为每个提取创建dojo.Deferreds,然后使用dojo.DeferredList并将延迟添加到它 - 请参阅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);

答案 1 :(得分: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();
});