循环使用延迟对象和承诺

时间:2012-10-03 06:53:04

标签: javascript jquery

我有以下代码

    $.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循环中,以便它等待在下一次迭代之前完成的承诺。起初看起来三个调用更容易嵌套,但这只是一段代码,现在嵌套调用数为15!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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();
        });
    }

答案 2 :(得分: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]);
    });
  })
});