jquery deferred in .each loop
这应该很简单。
我有一个被调用的函数,我需要等待所有异步操作完成。
我想要的是这样的...
1 | self.processSchema(data).done(function(results){ //do stuff}); |
processSchema函数使用$ .each循环并调用异步方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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()); } |
这似乎不起作用,我是$的新手。因此,任何指导都将对您有所帮助
每次迭代都需要一个承诺
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(); } |
对于函数式编程的恶魔(像我一样),这是adeneo答案的单表达版本:
1 2 3 4 5 6 7 8 9 | 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(); }; |
我还要指出,您正在遍历