在浏览器上执行不同的Promise,发生了什么?

IT技术 javascript reactjs events promise event-loop
2021-04-21 07:05:04
const b = () => {
  return new Promise(resolve => {
    resolve();
    Promise.resolve()
      .then(() => {
        console.log(1);
      })
      .then(() => console.log(3));
  });
};

const a = async () => {
  await b();
  console.log(2);
};

a();

在 safari、chrome(firefox) 上的不同行为,关于此描述的任何标准?

1个回答

你在这里有两个完全独立的Promise链:

Promise.resolve()
  .then(() => {
    console.log(1);
  })
  .then(() => console.log(3));


(async () => {
  await new Promise(resolve => {
    resolve();
  });
  console.log(2);
}());

不能保证3在 之后发生的其他排序1其余部分受Promise回调如何准确排队的影响,并且Safari 引擎中可能尚未实现的规范await(省略了一个不必要的 thenable 解析过程)发生了变化

@Sagivb.g 请参阅v8.dev/blog/fast-async以了解在我看来没有人应该关心的所有血腥细节(如果排队没有标准化,则不应该需要更改规范)很多细节)。是的,顺序有点可预测并且(理论上)引擎之间是一致的,但是一旦您将return undefined这些回调之一中的隐式替换为return Promise.resolve(undefined),顺序可能会改变。
2021-05-23 07:05:04
谢谢!至于“但是一旦你用 return Promise.resolve(undefined) 替换这些回调之一中的隐式返回 undefined,顺序可能会改变”,我知道它会改变那个顺序,但 TBH 我不确定我知道为什么,AFAIK 任何返回的值都隐式地用 a 包裹Promise.resolve,所以我不知道这里的细微差别是什么。我的心智模型是,每个首先.then创建一个“分支”,所有分支首先执行,然后.then按顺序链接除非其中一个返回一个Promise(这会在下一个循环中创建一个新分支?)
2021-06-17 07:05:04
+1 @Bergi,您对规范中的更改有参考吗?至于“其余部分受Promise回调如何准确排队的影响”,我认为有一个可预测的顺序,每个“分支”将首先排队,然后才是下一个链接的 thenable。(至少AFAIK)。这应该1 2 3 4在所有浏览器上产生Promise.resolve().then(() => console.log(1)).then(() => console.log(3)); Promise.resolve().then(() => console.log(2)).then(() => console.log(4));
2021-06-21 07:05:04