【发布时间】:2021-08-13 00:22:50
【问题描述】:
给定以下代码:
let promiseArray = [];
fs.readdir('someFolderHere', (err, fileList) => {
filesList.forEach(filename => {
// readFile returns a promise that resolves
// to an array of strings to insert into the database
readFile(fileName).then((records) => {
records.forEach((record) => {
promiseArray.push(db.insert(record)); // db.insert returns a promise
});
});
});
// console.log(promiseArray); // empty array here???
Promise.all(promiseArray).then((res) => {
console.log('resolved');
resolve(res);
}).catch((err) => {
console.log('rejected');
reject(err);
});
});
我无法弄清楚为什么 promiseArray 没有在 Promise.all() 中解析。这些 console.log 语句都不会打印出来。
猜测一下,我假设 Promise.all 在填充 promiseArray 之前被调用,因此它是一个空白数组,例如Promise.all([ ]).then(...)
我该如何解决这个问题。我正在尝试读取文件列表,对于每个文件,我正在读取几行数据。我需要将所有文件中的所有记录都插入到数据库中——promise 并不是很好。有没有办法让 Promise.all 等到 promiseArray 完全填充并且 forEach 完全完成?
【问题讨论】:
-
Promise.all(promiseArray)在任何promiseArray.push(db.insert(record));被执行之前被调用 -
@DraganS 是的,我很怀疑......我该如何绕过它?
-
这取决于要求。你将如何处理错误。你会更新 db 还是只有在所有文件都设法加载记录时才会更新 db。
-
使用
for (const p of promises) .....=> 这让一个等待下一个......
标签: javascript asynchronous ecmascript-6 promise es6-promise