gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:46:13 27 4
gpt4 key购买 nike

我正在尝试遍历一个将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com