2013-12-19 137 views
27

这应该是一个简单的。 我有一个被调用的函数,我需要等待所有的异步操作完成。 我想是这样的......jQuery推迟。每个循环

self.processSchema(data).done(function(results){ //do stuff}); 

的processSchema功能循环使用$。每个并调用异步方法。

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

'$ .deferred.apply' –

+0

我想你会需要一个(deferred1,deferred2 ... defferedN).then(函数(data1,data2 ... dataN){});然后执行每个db.executeSql的延迟。 –

回答

33

你需要为每个迭代

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(); 
} 
+0

adeneo,应该返回defcon.promise()? – gdex

+0

@gdex为什么不呢? –

+1

是的,它应该!可以返回承诺数组,但要保持OP想要调用该函数的语法,我认为一个主承诺返回,然后在解决所有其他承诺时解决将更容易,然后将所有直接返回数据作为参数数组? – adeneo

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,但是对迭代中的每个项目都没有做任何事情(即)回复没有任何争论。)现在,我不确定你的目标是什么,但这看起来并不合适:P

+0

我发布的功能还有很多,为简洁起见我没有包含一些非必要的东西...... – gdex