javascript - 解决 promise 是一个异步过程吗?

标签 javascript ecmascript-6 es6-promise

我确信下面的所有代码(除了 resolve(Promise.resolve(p2)) 之外)都是同步的。 因此,我预计结果首先是 p2,因为 p2.then 首先运行。然而 p1 在控制台中首先出现。

MDN 没有与该问题相关的内容。 规范有一些细节吗?有人可以逐步清楚地说明解决 promise 时会发生什么吗?

Chrome v60.0.3112.113

我的代码是:

var p1 = new Promise(function(resolve, reject){
  resolve("p1");
});

var p2 = new Promise(function(resolve, reject){
  //resolve("p2");
  var tempP = Promise.resolve("p2"); // for better description in discussion
  resolve(tempP);
});

p2.then(function(value){
  console.log(value)
})
p1.then(function(value){
  console.log(value);
});

最佳答案

I am sure that all the codes below, except resolve(Promise.resolve(p2)), are synchronous.

没有。 then 回调从不同步调用,它们始终是异步的(这很好)。这意味着它们的相对顺序是不确定的,并且取决于各自的 promise 何时兑现。如果您关心回调的顺序,请通过将 promise 相互链接起来使其明确。

示例中的履行顺序取决于您解决 promise 的值。请注意,在 p1p2 中,new Promise 回调和您的 resolve 都是同步的。每个解决方案都被放入队列中 - 至少与您似乎正在使用的原生 ES6 promise 一样。不同之处在于,您的 p2 是通过 Promise.resolve("p2") 解析的,它将使用其他 Promise 的结果解析 p2 - 再次放回到队列中。因此,p1 的实现首先发生,并且在 p2 的实现回调之前调用该回调。

所以一步一步发生的是

  1. new Promise 调用构造函数回调,而构造函数回调又
  2. 解决值为“p1”的新 promise - 履行它
  3. new Promise 返回,并将值分配给 p1
  4. new Promise 调用构造函数回调,而构造函数回调又
  5. 构造另一个用值“p2”实现的promise
  6. 并用它来resolves新的promise - 添加另一个resolve作为promise完成时的回调
  7. 内部 promise 安排回调,因为它已经完成
  8. new Promise 返回,并将值分配给 p2
  9. 调用 p2.then 并注册履行回调
  10. 调用 p1.then 并安排履行回调,因为 p1 已履行

之后,异步:

  1. 调用内部 Promise 的回调并使用值 "p2 解析 p2 - 履行它并调度其注册的回调
  2. 调用p1回调并记录“p1”
  3. 调用p2回调并记录“p2”

关于javascript - 解决 promise 是一个异步过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326034/

相关文章:

javascript - 将 <select> 下拉菜单变成更高级的 JQuery 插件是什么?

for-of 循​​环中的 Javascript 引用

javascript - Promise 的主体何时执行?

javascript - 在 ReactJS 中使用动态属性的模板文字

javascript - NodeJS 生成器永远不会到达某一行?

javascript - Promise `.then` 、 `.catch` 和 `.finally` 如何以及何时进入 EventLoop 微任务队列?

javascript - 等待所有嵌套的 promise 完成,但仍然对每个单独的 resolve 使用react

javascript - 需要按钮来显示和隐藏叠加导航

javascript - 从 AngularJS 中的服务内部访问 $scope 属性

javascript - Material-Table React 中的 StickyHeader