【发布时间】:2020-07-18 00:07:13
【问题描述】:
我需要在nodejs中调度一些后台作业,所以我需要一个作业在前一个完成后运行。
在一个函数里面我有下面的代码。
jobArray.forEach((item, i) => {
setTimeout(async () => {
await collectChannelsData(item)
}, i * 10000);
});
console.log('go to 2nd job')
jobArray.forEach((item, i) => {
setTimeout(async () => {
await collectVideosData(item)
}, i * 10000);
});
console.log('finish')
问题是,因为 setTimeout 是一个异步函数,forEach 不会等待它完成,而是继续执行第二个工作。有没有可能的解决方案?
提前谢谢你
编辑:一种可能的解决方案是将我的代码转换为:
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
for (const job of jobArray) {
await collectChannelsData(job)
await wait(10000);
}
for (const job of jobArray) {
await collectVideosData(job)
await wait(10000);
}
但我正在寻找一种方法,其中包括 setTimeout 和 forEach。
【问题讨论】:
-
在您添加“一种可能的解决方案”之前,我写了一个显示该选项的答案。这是你最好的选择。
-
我知道,我和你在同一时间写它:)。我知道它是最好的解决方案,我只是想知道是否可以使用 setTimeout 和 forEach 来实现。顺便说一句,感谢您的回答和您的时间。
-
没有。
.forEach()不关心它的回调返回什么,所以它只是盲目地运行迭代的所有循环,而无需等待任何异步操作完成。因此,没有办法让它做你想做的事情。此外,带有await的for循环看起来也更简单,您可以知道什么时候完成。这只是一个更好的选择。 -
但我正在寻找更好的方法 以何种方式更好?这正是您想要的,并且兼具可读性和高效性。除非您希望两个循环同时运行?
-
你应该解释为什么你想要
forEach而不是for of,否则你应该使用for of
标签: javascript node.js async-await