我知道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有助于减少样板代码
答案 0 :(得分:1)
您必须使回调函数具有前景,然后才能使用Promise.all:
dist_SLA <- c(1, 4, 9, 3, 4, 6)
for (i in 1:NROW(dist_SLA)){
sample_[i] <- sample(dist_SLA, size = i )
sp_[i] <- ifelse(dist_SLA == sample_[i], yes = sample_[i], no = "0")
lm_[i] <- lm(dist_SLA ~ sp_[i])
fit_[i] <- summary(lm_[i])$r.squared
}