javascript - nodejs 通过异步调用遍历数组?

标签 javascript node.js

我正在尝试遍历一个将 new Thing 推送到列表的数组,在 Thing 内部它会执行一些自己的异步调用。我将如何以同步方式遍历数组,因为 callback 需要列表中的数据才能工作。由于我的 for 循环是同步的并执行一些异步调用,因此如果完成,则在列表之前调用回调。

我不知道如何遍历数组并在执行回调之前完成所有工作

load(file, callback) {
  fs.readFile(file, (err, fd) => {
    var data = JSON.parse(fd);

    for(var i of data.array){
      this.list.push(new Thing(i.id)); // new Thing is Asynchronous
    }
    callback(); // Needs a finished list
    return;
  });
}

解决了:

通过将我的 Thing 类转换为同步类,通过删除对类内函数的异步调用,并首先实例化循环中的所有事物,然后调用 Promise.all 调用函数,我解决了问题:

load(file, callback) {
  fs.readFile(file, (err, fd) => {
    var data = JSON.parse(fd);

    for(var i of data.array){
      this.list.push(new Thing(i.id));
    }

    Promise.all(this.list.map(i => i.load()).then(callback);
  });
}

最佳答案

你必须在 Thing 中有一些状态来跟踪它的完成情况,例如你可以有一个实例变量,它是一个 promise 。所以考虑到这个 Thing

的组合示例
class Thing {
  constructor(id) {
    this.id = id;
    this.done = new Promise((resolve, reject) => {
      asyncThingWithCallback((err, data) {
        if (err) {
          this.asyncVal = null;
          reject(err);
        } else {
          this.asyncVal = data;
          resolve()
        }
      })
    });
  }
}

您可以像这样在回调中使用 done 属性:

load(file, callback) {
  fs.readFile(file, (err, fd) => {
    var data = JSON.parse(fd);

    for(var i of data.array){
      this.list.push(new Thing(i.id)); // new Thing is Asynchronous
    }

    Promise.all(this.list.map((thing) => thing.done))
      .then(callback)
  });
}

关于javascript - nodejs 通过异步调用遍历数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41326315/

相关文章:

asp.net - 如何停止缓存图像 - 或者 - 如何检查服务器上是否存在文件?

javascript - 加载模板和创建范围时应该使用 "controllers"还是 "directives"?

Node.js everyauth集群错误

javascript - Node.js require 未加载本地文件

javascript - io.sockets.on 无法在 Node.js 中的路由内工作

javascript - 小于或等于运算符: With NaN

javascript - 2 个字段加在一起不添加我的小数位

javascript - 如何在 ReactJS 中将属性列表作为字符串注入(inject)

mysql - nodeJS mysql库如何串行执行查询

javascript - v8/chrome/node.js函数内联