我有以下代码
$.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!
答案 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]);
});
})
});