javascript - 确定异步执行何时完成

标签 javascript asynchronous

我必须处理一个 entries 数组,需要为每个文件条目执行异步任务:getFileuploadResult 都是异步的任务。我的问题是如何知道何时使用 asyncjs 等异步库处理数组 doc.entries 。下面的代码只是我想要实现的目标的说明。

var doc = {
    version: '1.7',
    entries: [{
        date: '11/11/10',
        files: [{
            name: 100,
            executable: false
        },
        {
            name: 101,
            executable: false
        }]
    },
    {
        date: '11/12/10',
        files: [{
            name: 200,
            executable: false
        },
        {
            name: 201,
            executable: false
        }]
    },
    {
        date: '11/13/10',
        files: [{
            name: 300,
            executable: false
        }]
    },
    {
        date: '11/14/10',
        files: [{
            name: 400,
            executable: false
        }]
    }]
};

doc.entries.map(function(entry){

    entry.files.map(function(file){

        getFile(file, function(err, result){
            if(err){
                throw Error(err)
            }

            uploadResult(result, function(err, status){
                WriteOnDb(file.name, status, function(err, result){ ... });
            });
        })
    });
});

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

谢谢。

最佳答案

最简单的方法是使用 Promise 或更好的可观察量,但您也可以使用回调来实现 - 例如,您可以计算总共有多少任务以及完成了多少任务:

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);
            }
          });
        });
      }
    })
  });
});

关于javascript - 确定异步执行何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055022/

相关文章:

javascript - IE 忽略添加的 onclick 属性

javascript - 特定元素上的忙碌指示器(Wicket)

javascript - 仅在页 footer 分打印最后一页底部的表页脚

java - 如何测试某些异步过程的结果?

java - CompletableFuture runAsync 与 SupplyAsync,何时选择其中之一?

javascript - jquery every - 来自另一个脚本的函数

javascript - Spring Security 中的基本身份验证(身份验证失败消息)

javascript - 使用 Javascript Fetch API 对异步获取的数据进行排序

javascript - XMLHttpRequest异步读取,如何不使用匿名函数?

ajax - 复杂的 redux-loop 例子?