javascript - nodejs依次运行数组中定义的作业
问题描述
我发现我在数组中定义的作业都是一次运行的:
const { promisify } = require('util')
const wait = promisify(setTimeout)
async function longjob(ms) {
await new Promise(r => setTimeout(r, ms));
}
const longjobs = [ 100, 200, 120 ]
async function myFlow(){
longjobs.forEach( async (j) => {
await longjob(j)
console.log(`done ${j}`)
await wait(500)
console.log(`done wait ${j}`)
})
}
myFlow()
$ node jobs_in_array.js
done 100
done 120
done 200
done wait 100
done wait 120
done wait 200
但是我想一个接一个地运行数组中定义的那些作业。我一定错过了一些非常简单的东西。请帮忙。
解决方案
即使您将async
回调传递给.forEach()
,它也不会等待其执行。因此,您最终一个接一个地调用了 3 个异步函数,但没有任何迹象表明脚本应该等待它们中的每一个执行。
你可以做的是使用for ... of
循环:
async function myFlow(){
for (const j of longjobs) {
await longjob(j)
console.log(`done ${j}`)
await wait(500)
console.log(`done wait ${j}`)
}
}
推荐阅读
- python - Python:按不同顺序按多列对嵌套的字符串和数字列表进行排序
- firebase - 使用 Firebase 的 JWT 令牌
- julia - 计算二项分布数据的可能性
- javascript - 如何搜索文本文件中的每一行并捕获以 DDMMM 格式开头的行?
- android - 没有 java.time 的 Android 中的日期/时间操作
- json - Json需要解析两次?
- python - how to interact with recaptcha audio button selenium python
- java-8 - RxJava objects assing from findAll are null
- machine-learning - Can someone explain why this scalar layer non-trainable?
- java - Using JasperFillManager.fillReport(jasperReport,parameters, dataSource), Can JasperReport be reused?