【问题标题】:JS Promise's inconsistent execution order between nodejs versionsJS Promise 在 nodejs 版本之间执行顺序不一致
【发布时间】:2020-09-13 21:04:05
【问题描述】:

我正在阅读关于nodejs promise here的文章。

然后我尝试运行以下示例代码(来自文章)

const p = Promise.resolve();

(async () => {
  await p; console.log('after:await');
})();

p.then(() => console.log('tick:a'))
 .then(() => console.log('tick:b'));

节点版本之间的结果不一致。节点 v10 远离所有其他版本。

我正在使用 mac。

v8.17.0
after:await
tick:a
tick:b

v10.20.1
tick:a
tick:b
after:await

v12.17.0
after:await
tick:a
tick:b

v14.3.0
after:await
tick:a
tick:b

文章说 v10 引入了一项重大更改以更正执行顺序,而 v8 的行为是一个错误。但是,当我使用 v12 和 v14 进行测试时,它们给出的结果与 v8 相同。

谁能解释一下为什么会这样?

【问题讨论】:

  • @jfriend00 这篇文章是关于节点 v10 中的重大更改。它说 nodev10 实现了 v8 的正确规范和行为是一个错误。但是,当我使用 v12、v14 进行测试时,它们给出的结果与 v8 相同。我应该在我的问题中包含这些信息
  • this 是另一个问题(来自我)。我对此一无所知,但我认为他们之间可能有关系
  • 祝你好运解决这些求知欲问题。出于好奇,我会遵循答案,但我更喜欢编写我的代码,因此如果需要在 Promise 链之间进行特定排序,那么代码会以声明方式强制按其编写方式进行排序,而不依赖于这一级别的引擎实现细节。
  • 一直在尝试在不使用 async / await 的情况下重新创建不同的行为,但我编写的所有内容似乎都会产生节点 8/12/14 的行为,即使在节点 10 中也是如此。我我倾向于说节点 8 实际上按照当前规范执行了正确的行为。对我来说,那篇文章似乎是说在版本 10 和 12 之间对规范中的程序进行了修改,所以旧规范中的 8 是错误的,旧规范中的 10 是正确的,而 12 和 14 是正确的新规范。

标签: node.js async-await es6-promise


【解决方案1】:

这是由于 this change in the specs 现在允许短路 await promiseInstance 不会在内部将 promiseInstance 包装到新的 Promise 中,因此节省了两个滴答声(一个用于等待 promiseInstance,一个用于等待唤醒 async 函数)。

Here is a detailed article 来自规范补丁的作者,也恰好是 v8 开发者。在那里,他们解释了这种行为实际上是如何在 nodejs v.8 中出现的,但到那时却违反了规范,即一个错误,他们在 v.10 中修复了,在这个补丁使它成为官方的做法之前,它得到了直接在v8引擎中实现。

所以如果你希望在这个补丁之前应该发生的内联版本是

const p = Promise.resolve();

new Promise((res) => p.then(res)) // wait for p to resolve
  .then((res) => Promise.resolve(res)) // wake up the function
  .then((res) => console.log('after:await'));

p.then(() => console.log('tick:a'))
 .then(() => console.log('tick:b'));

当补丁成功时

const p = Promise.resolve();

p.then(() => console.log('after:await'));

p.then(() => console.log('tick:a'))
 .then(() => console.log('tick:b'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2018-10-16
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2016-08-07
    相关资源
    最近更新 更多