1

私は次のコードを持っています

    $.when(tableInsert("index.php/get/sync/riesgos", insert_riesgo, evalua.webdb.db, callback)).then(function(){
        update_records("riesgos");
        $.when(tableInsert("index.php/get/sync/estancias", insert_estancia, evalua.webdb.db, callback)).then(function(){
            update_records("estancias");
            $.when(tableInsert("index.php/get/sync/riesgosestancias", insert_riesgoestancia, evalua.webdb.db, callback)).then(function(){
                update_records("riesgosestancias");
            });
        });
    });

forループまたは$.eachループ内に統合して、次の反復の前にpromiseが実行されるのを待つ方法を見つけようとしています。最初は、3つの呼び出しをネストする方が簡単なように見えますが、これはコードの一部にすぎず、ネストされた呼び出しは15をカウントします。

4

3 に答える 3

5

たとえば、最初にデータを含む配列が必要です。

var calls = [
    {
        url: "index.php/get/sync/riesgos",
        func: insert_riesgo,
        update: "riesgos"
    },
    ...
];

.pipe 次に、 [docs]を使用して呼び出しを連鎖させることができます。

var def = (new $.Deferred()).resolve();

$.each(calls, function(call) {
    def = def.pipe(function() {
        return tableInsert(call.url, call.func, evalua.webdb.db, callback).done(function() {
            update_records(call.update);
        ]);
    });
});

$.whenあなたの例では必要はありません。

于 2012-10-03T07:09:21.403 に答える
0

私はあなたの答え、@ felix-klingを見る前に考えていて、同様のアプローチに到達しました:

配列を作成します。

webdb.tables=[{
    name: "riesgos",
    callback: insert_riesgo,
},{
    name: "estancias",
    callback: insert_estancia,
},{
    name: "riesgosestancias",
    callback: insert_riesgoestancia,
}];

そして、再帰関数ループを使用して:

var i=0;
    function recursive(){
        $.when(tableInsert("index.php/get/sync/"+webdb.tables[i].name, webdb.tables[i].callback, webdb.db, callback)).then(function(){
            update_records(webdb.tables[i].name);
            if(++i<webdb.tables.length)
                recursive();
        });
    }
于 2012-10-03T07:15:58.500 に答える
0

あなたが全体の非同期に興味があるならDeferred

var arr = [
  ["index.php/get/sync/riesgos", insert_riesgo, "riesgos"],
  ["index.php/get/sync/estancias", insert_estancia, "estancias"],
  ["index.php/get/sync/riesgosestancias", insert_riesgoestancia, "riesgosestancias"]
];

var dfd = $.Deferred().resolve();

$.each(arr, function(i, item) {
  dfd.then(function() {
    return $.when(tableInsert(item[0], item[1], evalua.webdb.db, callback)
    .then(function() {
      update_records(item[2]);
    });
  })
});
于 2012-10-03T07:46:08.167 に答える