-
术语
- “promise”是个对象或者方法,有
then方法 - “thenable”是个对象或者方法,定义
then方法 - “value”是任何javascript的合法值
- “exception”是通过
throw抛出的值 - “reason”是Promise被拒绝的理由
- “promise”是个对象或者方法,有
-
需求
-
Promise状态
promise的状态一定是处于“pending”(等待),“fulfilled”(履行),“rejected”(拒绝)三个之中
-
Then方法
Promise必须提供一个then方法去获取它的当前状态,最终值或者否定的理由
then方法接受两个参数,promise.then(onFulfilled, onRejected)onFulfilled和onRejected两个参数都不是必填的,如果不是函数类型的参数,会被忽略- 如果
onFulfilled是函数- 在promise被履行之后被调用,只会被调用一次
- 如果
onRejected是函数- 在promise被拒绝之后,只会被调用一次
-
then方法必须返回一个promise对象promise2 = promise1.then(onFulfilled, onRejected);- 如果
onFulfilled,onRejected方法返回了一个值x,那么就需要进行进一步的程序判断[[Resolve]](promise2, x) - 如果
onFulfilled,onRejected方法执行过程中抛出异常e,那么promise2被拒绝,理由是异常e - 如果
onFulfilled不是一个函数,promise1是fulfilled状态,那么promise2被履行,理由和promise1一样 - 如果
onRejected不是一个函数, promise1是rejected状态,那么promise2被拒绝,理由和promise1一样
- 如果
-
承诺解决过程(
[[Resolve]](promise, x))- 如果promise和x是同一个对象,promise被拒绝,理由是
TypeError - 如果
x是promise对象,那么就采用他的promise状态- 如果
x是pending状态,等待被fulfilled或者rejected - 如果
x是fulfilled状态,promise被履行,理由和x一样 - 如果
x是rejected状态,promise被拒绝,理由和x一样
- 如果
- 如果
x是个对象或者函数- 把
x.then赋值给then - 当获取
x.then值的时候,抛出异常e的时候,promise被拒绝,理由是e - 当
then是一个函数的时候,调用这个函数(把x当作this),第一个参数是resolvePromise,第二个参数是rejectPromise- 当resolvePromise被调用且
y作为参数的时候,继续执行承诺解决过程[[Resolve]](promise, y) - 当rejectPromise被调用且
r作为参数,promise被拒绝,理由是r - resolvePromise,rejectPromise都被调用的时候,谁先调用谁生效,后面调用的将被忽略
- 当resolvePromise被调用且
- 当
then不是一个函数的时候,promise被fulfile,理由是x
- 把
- 如果
x不是对象也不是函数,promise被fulfilled,理由就是x
- 如果promise和x是同一个对象,promise被拒绝,理由是
-