确定何时完成异步执行

时间:2015-12-02 23:21:55

标签: javascript asynchronous

我必须处理一个tag_or_commit数组,该数组需要为每个文件条目执行异步任务:entriesgetFile都是异步任务。我的问题是我怎么知道使用像asyncjs这样的异步库处理数组uploadResult的时间。下面的代码只是我想要完成的一个例子。

doc.entries

我如何知道最后一个文件何时存储在数据库上然后再执行其他操作?

感谢。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用promises或更好的observable,但你也可以使用回调 - 例如你可以计算总共有多少任务以及完成了多少任务:

var total = doc.entries
  .map(function (entry) {
    return entry.files.length;
  })
  .reduce(function (x, acc) {
    return acc + x
  }, 0);

var finished = 0;

function finishCallback(err) {
  if (err === null) {
    /// all async tasks are finished;
  }
}

doc.entries.map(function (entry) {
  entry.files.map(function (file) {
    getFile(file, function (err, result) {
      if (err) {
        finishCallback(err);
      } else {
        uploadResult(result, function (err, status) {
          WriteOnDb(file.name, status, function (err, result) {
            if (err) {
              finishCallback(err);
            } else {
              finished += 1;
              if (finished === total) finishCallback(null);
            }
          });
        });
      }
    })
  });
});