我知道Array.prototype.map
是同步操作。另一方面,如果map函数是回调函数(异步),undefined
将立即返回。
所以我的问题是,下一个函数可以安全地假定所有回调函数都已完成吗?
示例代码可能使我的问题更清楚:
results = files.map(file => {
fs.readFile(file, (err, data) => {
if (err) throw err;
return process(file) //will return the processed value, NOT a promise
});
)
//I know results will be [undefined, undefined, undefined ...]
//But can I assume all the files have been processed if I reach here?
console.log('done')
我不在乎返回值。这就是为什么我不想打扰
await/async
的原因。我只想确保所有回调函数都已调用并返回。那可能吗 ?-------更新--------
除了答案,我发现这些文章还帮助我理解了这个问题:
https://medium.com/@antonioval/making-array-iteration-easy-when-using-async-await-6315c3225838
Using async/await with a forEach loop
我必须使用promise来确保所有回调迭代项都已完成。因此,使用bluebird promise.map有助于减少样板代码
最佳答案
您必须使回调函数具有前景,然后可以使用Promise.all:
const results = Promise.all(files.map(file => new Promise(resolve => {
fs.readFile(file, (err, data) => {
if (err) throw err;
resolve(process(file));
});
));
results.then(() => {
console.log('done')
//...
});