jquery在.each循环中延迟

gde*_*dex 27 javascript jquery loops deferred

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

self.processSchema(data).done(function(results){ //do stuff});
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,我是$的新手.推迟所以任何指导都会有所帮助

ade*_*neo 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();
}
Run Code Online (Sandbox Code Playgroud)

  • @adeneo实际上你可以简单地返回`$ .when`的结果,而不创建"主"承诺? (2认同)
  • @Tomalak` $ .when.apply(...).promise()` (2认同)

Mil*_*osz 7

对于功能编程恶魔(像我一样),这里是adeneo答案的单表达式版本:

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();
};
Run Code Online (Sandbox Code Playgroud)

另外我想注意你正在迭代table,但是没有对迭代中的每个项做任何事情(即你的回调each没有参数.)现在,我不确定你的目标是什么,但是这个对我来说似乎不对:P