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

如果您对整个异步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 回答
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 回答