web-dev-qa-db-ja.com

.eachループで遅延したjquery

これは単純なものでなければなりません。呼び出される関数があり、すべての非同期操作が完了するまで待機する必要があります。私が欲しいのはこのようなものです...

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に新しいので、どんなガイダンスも役立つでしょう

27
gdex

繰り返しごとにプロミスが必要です

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

関数型プログラミングの悪魔(私のような)の場合、ここに 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();
};

また、tableを繰り返し処理しているが、繰り返しの各項目では何もしていないことに注意してください(つまり、eachのコールバックには引数がありません)。私はあなたの目標が何であるかわかりませんが、これは私には正しくないようです:P

7
Milosz