node.js - 在 Windows 任务调度程序下运行时节点退出且没有错误且不等待承诺/回调
问题描述
我的主要观察是:
- 如果在 forEach 循环中运行异步函数,例如:
await Object.keys(o).forEach(function(key) { an_async_func() }
然后它无法运行。
- 但是,当我将相同的代码更改为:
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()
所以我仍然在摸索问题是什么。
解决方案
await Object.keys(o).forEach
不起作用,因为 .forEach
不返回 a Promise
,它返回 a void
。await
只需使用 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()
推荐阅读
- clojure - Cider nREPL 使用 virtualbox 错误:远程对等点断开连接
- php - PHP conditional regex
- terraform - 如何实现 terraform 嵌套循环构造?
- sympy - 为什么 SymPy 不取代指数?
- javascript - 文件上传开始/完成时显示/隐藏微调器
- django - 进行迁移时“无法导入名称视图”(Django,Python 3.6)
- sql-server - SQL Server UPDATE 触发器 - 破坏事物
- ios - Cocoapod 中的命名颜色
- json - 新的 Promise 输出返回单词“Promise { }”
- dart - FireStore 和颤振