首页 > 解决方案 > 在 Windows 任务调度程序下运行时节点退出且没有错误且不等待承诺/回调

问题描述

我的主要观察是:

  1. 如果在 forEach 循环中运行异步函数,例如:await Object.keys(o).forEach(function(key) { an_async_func() }

然后它无法运行。

  1. 但是,当我将相同的代码更改为:for (var key in o) { an_async_func() }

然后它运行。

在任务调度程序之外,就像在 Windows CLI 中一样,这两种情况都可以正常运行异步函数。

我尝试了一个最小的可行示例,但它没有表现出同样的问题(我起草的示例如下所示)。

'use strict'

const timeoutPromise = (time) => {
    return new Promise((resolve, reject) => { setTimeout(() =>
        { console.log('timeout=',time); resolve('done') }, time) })
}

async function main() {
  var o = { a:1,b:2 }

  await Object.keys(o).forEach(function(key) {
     timeoutPromise(5000)
     console.log(key)
  })
}

main() 

所以我仍然在摸索问题是什么。

标签: node.jswindowsasync-await

解决方案


await Object.keys(o).forEach不起作用,因为 .forEach不返回 a Promise,它返回 a voidawait只需使用 Promise(或thenable对象)即可。

在这种情况下,只需使用for loop不带回调 ( .forEach(callback)) as for in,并且您需要await一个异步任务(如果您想等到任务完成)

'use strict'

const timeoutPromise = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('timeout=', time);
      resolve('done');
    }, time)
  })
}

async function main() {
  var o = {
    a: 1,
    b: 2,
  }

  for (const key in o) {
    await timeoutPromise(5000); // sleep
    console.log(key)
  }
}

main() 

推荐阅读