我有一系列嵌套的异步调用需要在我的代码继续之前完成。函数save_part1调用sqlite数据库并返回感兴趣的行。对于每一行,我进行ajax调用以远程保存它们。
从我所读到的关于promises和deferred的内容,我只看到它们被用在ajax调用的上下文中。最重要的是,它会让我的大脑受伤。
问题:如何在启动save_part2之前等待所有ajax调用完成?
90
答案 0 :(得分:1)
只要你有ajaxCall_item返回jQuery延迟对象,你就可以让save_part1
返回一个延迟对象,将返回的promises收集到一个数组中,用$.when
调用它们并解析“promise”一旦所有请求都完成。然后你就可以写下:save_part1().then(save_part2);
。这是一个未经测试的例子:
function save() {
save_part1().then(save_part2).fail(function(err) {
// ohno
});
}
function ajaxCall_item1(row) {
return $.ajax({ ... });
}
function save_part1()
{
var dfd = jQuery.Deferred();
var promises = [];
db.transaction(function (tx) {
tx.executeSql("SELECT * FROM TABLE1", [],
function (transaction, results) {
for (var i = 0; i < results.rows.length; i++) {
var row = results.rows.item(i);
promises.push(ajaxCall_item1(row));
}
$.when.apply($, promises).then(function() {
dfd.resolve.apply(dfd, arguments);
});
}, function(err) {
dfd.reject(err);
});
});
return dfd;
}