首页 > 解决方案 > nodejs依次运行数组中定义的作业

问题描述

跟进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

但是我想一个接一个地运行数组中定义的那些作业。我一定错过了一些非常简单的东西。请帮忙。

标签: javascriptnode.jsecmascript-6async-await

解决方案


即使您将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}`)
  }
}

推荐阅读