这应该是一个简单的。 我有一个被调用的函数,我需要等待所有的异步操作完成。 我想要的是这样的......
self.processSchema(data).done(function(results){ //do stuff});
processSchema函数使用$ .each循环并调用异步方法。
var processSchema = function(data)
{
var def = new $.Deferred();
$.each(table, function()
{
//calls an async SQLitePlugin method
db.executeSql(sql, data, function(tx, results){
def.resolve(results);
}
}
return(def.promise());
}
这似乎不起作用,我是$.Deferred的新手,所以任何指导都会有所帮助
答案 0 :(得分:34)
每次迭代都需要一个承诺
var processSchema = function(data) {
var promises = [];
$.each(table, function() {
var def = new $.Deferred();
db.executeSql(sql, data, function(tx, results){
def.resolve(results);
});
promises.push(def);
});
return $.when.apply(undefined, promises).promise();
}
答案 1 :(得分:7)
对于功能编程恶魔(像我一样),这里是adeneo's answer的单表达式版本:
var processSchema = function(data) {
return $.when.apply($, $.map(table, function() {
var def = new $.Deferred();
db.executeSql(sql, data, function(tx, results){
def.resolve(results);
});
return def;
})).promise();
};
另外我想注意你正在迭代table
,但是没有对迭代中的每个项做任何事情(即each
中的回调没有参数。)现在,我不确定你的目标是什么,但这对我来说似乎不对:P