关于javascript:.each循环中延迟的jquery

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

我还要指出,您正在遍历table,但是对迭代中的每个项目都没有做任何事情(即each中的回调没有参数。)现在,我不确定 您的目标是,但这对我来说似乎不正确:P