前言面向对象的设计思想对于开发者更加友好可进行数据封装、模块化复用、 降低代码的复杂度和维护成本而Promis用于解决JS中的异步回调问题它是面向对象设计思想在异步编程中的一种实践包括类、实例、实例方法、类方法静态方法、状态封装等一些OOP概念同时Promise 设计遵循Promise/A 规范如果一个对象/函数Thenable满足该规范中关于 then 方法的行为定义那么称它为Promise。JavaScript中其面向对象的本质是基于原型通过构造函数来模拟“类”的概念构造函数、实例、原型。ES6推出后引入class关键字等语法糖为JS提供更接近传统面向对象的语法结构。Promise/A 规范在Promise链中return一个值x下一个Promise会变成什么状态 ——[[Resolve]](promise,x)状态机pending、fulfilled、rejectedpending - fulfilled / rejectedfulfilled、rejected 状态下状态固定不可以变then实例方法负责外部监听Promsie的结果消费者一定返回一个新的Promise链式then接收两个回调onFulfilledonRejected普通函数then方法如果“回调”返回值则值传给下一个then抛出异常时下一个then接收拒绝原因注意then可以接收成功和失败的情况catch也可以捕获失败。then的失败回调只能捕获它前一个Promise失败状态无法捕获then成功回调函数onFulfilled中抛出的错误catch可以捕获Promise链中所有上游的错误错误捕获就近原则 和 穿透原则实现源码的分析[[Resolve]](promise,x) 伪代码promise 和 x 指向同一个对象情况 : 返回TyperError防止造成死锁const p1 new Promise((resolve, reject) { setTimeout(() { try{ resolve(p1) }catch(e){ console.log(e) } },100) }) p1.catch(err{console.log(err})x是一个标准的promise情况当前promise状态 跟随 返回的Promise状态// 链式Promise: p1 和 p2、p3 const p1 new Promise(resolve { setTimeout(() resolve(p1 完成), 1000); }); p1.then((){ return new Promise(resolve setTimeout(resolve,1000,OK)) // cb1 }).then(res { console.log(res) })执行流程分析第一步 注册并暂存p1.then() 动作创建 p2空容器注册回调函数【cb1】将回调函数then的onfulfilled和p2的的引用resolve放入 p1 内部列表。第二步 状态变更与触发微任务p1对象的executor中异步函数完成改变p1状态存储值p1读取内部列表将回调放入全局的微任务队列。第二步执行回调【 cb1】并return 即Promise/A中的x是一个Promise对象第三步触发 [[Resolve]](p2,x)第四步链接下一个.then重复上述操作x是一个thenable对象跟随 Thenable 的执行结果x是一个普通值当前Promise立即变为fulfilled状态Promise类实例方法then、catch、finally类方法/静态方法resolve、reject、all、allSettled、race、anyresolve方法区分“状态” 和 “触发状态改变的函数”resolve方法(类的constructor内)的实现过程分析先检查状态是否为pending改变状态pending - fulfilled存储值保存传入的value供后续.then()使用触发微任务将注册的回调函数推入微任务队列resolve参数普通值和对象传递到then方法的参数中Promise对象当前Promise等待传入的Promsie处理Thenable等待then方法的处理