前言
你真的完全知道 Promise
的执行顺序吗,如果你只通过 [Promise A+ 规范]了解 promise
,你一定不能完全理解 Promise
,不信的话你来看看下面这道题
Promise.resolve().then(() => {console.log(0);return Promise.resolve(); // 如果注释这一行,结果又会是什么呢}).then(() => {console.log(4);});Promise.resolve().then(() => {console.log(1);}).then(() => {console.log(2);}).then(() => {console.log(3);}).then(() => {console.log(5);}).then(() => {console.log(6);});// 0 1 2 3 4 5 6
如果你不能清晰的说出这两种情况的过程,这篇文章一定对你有帮助。
在阅读本文之前,希望你了解:
- Promise 基本语法
- 事件循环模型
- 微任务
Promise.prototype.then
then
方法是一个 异步的 微任务,解析到这行代码的时候,会把 then
之后的 Promise
链条放到 微任务队列 中
⭐️then 的返回值
Promise.resolve().then(() => {}); // fulfilled
then
可以链式调用的原因是因为 then
方法可以返回一个 新 的 Promise
实例,注意是 新的实例,与 Promise
链条传递的 之前的 Promise
实例 并无多大关系,而且这个新的实例 状态 一定不是 pending
,知道这些内容就足够了
⭐️控制 then 返回值
这里的内容才是重点:then
处理返回值有两种情况:
- 不
return
值(等同于return undefined
) / 显示地return
非promise
的值, - 显示
return
具有resolve
的promise
的值
如果是
return
非resolve
的值(排除reject
情况),Promise
链不会传递下去,所以这里不讨论这种情况
then
处理这两种情况决然不同,这里的观点你基本不会在任何书上看到,全部来自于 v8 引擎 内部实现
1.处理 return
非 promise
的值
Promise.resolve().then(() => {});