promise a+ 规范
根据我的个人理解,与实际有偏差
术语
Promise
是一个拥有 then 方法的对象或函数;thenable
是一个定义了 then 方法的对象或函数;value
指任何 JavaScript 的合法值(包括 undefined , thenable 和 promise);exception
是使用 throw 语句抛出的一个值;reason
表示一个 promise 的拒绝原因。
Promise
- 共三种状态:
pending
等待,fulfilled
完成,rejected
拒绝; - 处于
pending
可转换为fulfilled
或rejected
; - 处于
fulfilled
不可再改变,且有一个不可变的value
; - 处于
rejected
不可再改变,且有一个不可变的reason
。
then
一个 Promise
必须提供一个 then
方法以访问当前值(value
或 reason
);
then
方法接受两个可选参数,如果该参数不是函数则被忽略:
promise.then(onFulfilled, onRejected);
- onFulfilled
- 当
Promise
状态为pending
时不可调用; - 当
Promise
状态为fulfilled
被调用,其第一个参数是当前value
; - 只执行一次。
- 当
- onRejected
- 当
Promise
状态为pending
时不可调用; - 当
Promise
状态为onRejected
被调用,其第一个参数是当前reason
; - 只执行一次。
- 当
- 调用时机:异步执行;
- 调用要求:作为函数调用(即严格模式下
this
为undefined
,非严格模式下this
为window
); - 多次调用
- 当
Promise
为fulfilled
时,所有onFulfilled
函数按顺序执行; - 当
Promise
为rejected
时,所有onRejected
函数按顺序执行。
- 当
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
...
-
返回:必须返回一个
Promise
对象- 如果
onFulfilled
或onRejected
返回一个值x
,则运行resolvePromise
; - 如果
onFulfilled
或onRejected
抛出异常reason
,则promise2
状态为rejected
,并且当前值为reason
; - 如果
onFulfilled
或onRejected
不为函数,则promise2
取promise1
的状态与值;
- 如果
promise2 = promise1.then(onFulfilled, onRejected);
resolvePromise
promise2 = promise1.then(value => value);
resolvePromise(promise2, value)
主要是用来解决 value
是一个 Promise
对象的情况。
-
value
和promise2
是同一个对象,则抛出异常; -
如果
value
是一个Promise
对象value
处于pending
,返回的promise
保持pending
,直到value
状态改变;- 否则用相同的状态和值执行。
-
如果
value
是一个对象或函数- 把
value.then
赋值给then
; - 如果
then
是一个函数,将value
绑定为该函数this
并执行,第一个参数为onFulfilled
,第二个参数为onRejected
;onFulfilled
返回y
,则继续执行resolvePromise
;onRejected
返回z
,返回的promise
以z
执行拒绝;
- 如果
then
是一个对象,返回的promise
以value
执行完成; - 以上操作抛出异常
reason
,返回的promise
以reason
执行拒绝;
- 把
-
否则返回的
promise
以value
执行完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通