【问题标题】:script ends despite unresolved promise尽管承诺未解决,脚本仍结束
【发布时间】:2021-01-03 04:34:12
【问题描述】:

考虑一下:

(async function () {
  const arr = [];
  await new Promise(r => arr.push(r));
  console.log("done")
})();

脚本在await 处终止,并且日志从未打印到 sdout,我不明白为什么

【问题讨论】:

    标签: javascript node.js promise async-await


    【解决方案1】:

    您的代码没有问题。这只是 Node 的模型。如果没有挂起的 I/O 挂起的 Promise,则不会阻止 Node 退出。

    如果你想阻止 Node 退出,你可以安排一些 I/O,但挂起的 promise 实际上并不能阻止 Node 退出。

    我并不是说我同意或喜欢这种行为,但这就是我们目前所做的 ?

    编辑:在问题跟踪器中找到 the bug report/discussion

    【讨论】:

    • 我也不确定在这里做什么是正确的(这就是为什么我没有在那个问题中发表评论)并且我看到了双方(没有 I/O 和类似回调的行为 - 和该过程令人惊讶地退出)是有效的。如果您感觉强烈,请权衡这个问题。 Node 中令人惊讶的这些行为是 Node 不确定什么是正确的行为。
    • 非常有趣,谢谢。我明白为什么节点退出,但我仍然没有解释为什么我没有将日志打印到 sdout
    • @NicoAdrian 很好,因为那段代码永远不会执行。既是因为您从未真正履行该承诺(因此即使节点等待它也不会被执行),即使您这样做了 - Node 也不会等待 microtick 承诺等待对其做出反应。尝试在后台运行带有 setInterval 的代码(这样节点就不会退出)
    • 我知道它与 setInterval 一起工作,但我希望它至少执行 console.log 但现在我明白了,告诉我如果我错了,当使用 async/await 时,下一行充当回调或承诺的then 部分
    • 是的,这就是要点。 async/await 的全部意义在于我们可以编写异步代码“好像”它是同步的,而下一行是“就像一个 then”+ 错误处理。有趣的是,这种对“链和返回”核心的抽象是编程的超级基础,通常称为“monadic”,来自 Haskell 等语言的 async/await 的功能等价物称为“do notation”,它允许低级链接(适用于各种东西,而不仅仅是 I/O)。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2020-03-16
    • 2014-12-02
    • 2020-10-22
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多