jquery在.each循环中延迟

时间:2013-12-19 18:14:20

标签: javascript jquery loops deferred

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

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的新手,所以任何指导都会有所帮助

2 个答案:

答案 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