等待嵌套的异步调用完成

时间:2016-02-12 17:23:15

标签: javascript jquery ajax jquery-deferred

我有一系列嵌套的异步调用需要在我的代码继续之前完成。函数save_part1调用sqlite数据库并返回感兴趣的行。对于每一行,我进行ajax调用以远程保存它们。

从我所读到的关于promises和deferred的内容,我只看到它们被用在ajax调用的上下文中。最重要的是,它会让我的大脑受伤。

问题:如何在启动save_part2之前等待所有ajax调用完成?

90

1 个答案:

答案 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;
}