【问题标题】:Promise Unexpected Behavior, Execution Order承诺意外行为,执行顺序
【发布时间】:2017-06-28 08:21:44
【问题描述】:

在将 Chrome 升级到 58 之前,我没有任何错误。

进一步说明:我的代码在周日工作,我不知道执行的异步性质,两天后才知道!

new Promise((s, f) => {
    console.log(1);
    s();
    console.log(2);
})
.then(r => {console.log(3)})

console.log(4);

输出:

1

2

4

3


1- 为什么在 console.log(2) 之后执行 'then' ???

可能的答案:因为promise结果会在body返回后执行

2- 为什么在 console.log(4) 之后执行 'then' ???

【问题讨论】:

  • Promise 不应该是同步的。想象一下解析器/拒绝器是setTimeout(function () {...}),你会得到基本相同的行为。
  • 我的所有测试浏览器(firefox/chrome/edge/opera)都有相同的顺序。对于第一个问题我不知道,但是 3 出现在 4 之后似乎是逻辑的,就像在常规异步调用中一样,后面的代码在回调之前执行。
  • @PatrickRoberts 对,但是我的代码在周日工作,我不知道执行中的异步性质,今天发现了这个,很有趣!

标签: javascript promise es6-promise


【解决方案1】:

由于 Promise 的异步特性,then 处理程序将存储在事件循环的消息队列中。只要 JavaScript 运行时的调用堆栈为空,就会处理此队列的元素。在您的场景中,console.log(4); 需要在封闭函数从调用堆栈中取出之前运行,此时 JavaScript 引擎可以开始处理消息队列中的项目(假设封闭函数是顶级函数),导致在then 中运行代码。

【讨论】:

    【解决方案2】:

    Thank you @PatrickRoberts for providing a reference:

    Promises 自然是 ASYNC 并在下一次事件循环执行时执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多