嘿伙计们,我并不精通处理异步设计模式,并且我在编写执行两次异步数据提取的脚本时遇到问题。
我使用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()
非常感谢任何帮助!
答案 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();
});