内容
1. 如何修改promise的状态
resolve(value)
:如果当前状态是pending
,就会变为resolved
reject(reason)
:如果当前状态是pending
,就会变为rejected
抛出异常
:如果当前状态是pending
,就会变为rejected
2. 能否执行多个回调
一个promise
对象指定多个成功/失败的回调函数,都会调用吗?
=> 指定回调用的就是then()
方法,如果我们使用then()
方法为一个promise
对象指定多个回调,这些回调是不是都会执行?
- 当
promise
对象改变为相应状态时都会调用
用then()
指定了两个成功的回调,当promise
对象状态变为成功,这两个回调都会执行的
3. 改变状态与指定回调的顺序问题
改变promise状态
和指定回调函数
,谁先谁后?
⚠️:这里是指定回调函数,指定回调是执行then()
方法,不是执行then()
里的回调函数
- 当执行器函数中的任务是一个
同步
任务,就是先改变状态,再去指定回调
当执行器函数中的任务是一个异步
任务,改变状态需要一定的时间,那就是先指定回调,再改变状态 - 如何先改变状态再指定回调?
- 在执行器中执行同步任务,直接调用
resolve()
/reject()
- 延长更长时间才调用
then()
- 在执行器中执行同步任务,直接调用
- 什么时候才能得到数据?(回调函数什么时候执行)
- 如果先指定的回调,当状态发生改变时,回调函数就会调用,得到数据
- 如果先改变的状态,当指定回调时,回调函数就会调用,得到数据
4. then()返回结果的状态由什么决定
then()
执行后返回的结果是一个promise
对象,那么这个新的promise
对象的状态由什么决定?
- 由
then()
指定的回调函数
的执行结果
决定- 如果抛出异常, 新的
promise
对象变为rejected
,reason
为抛出的异常 - 如果返回的是非
promise
的任意值,新的promise
对象变为resolved
,value
为返回的值 - 如果返回的是另一个新的
promise
,此promise
的结果就会成为新的promise
的结果
- 如果抛出异常, 新的
看以下例子:
- 情况1: 执行结果
抛出异常
这里的then()
会执行的是成功的回调
,那么then()
返回的一个新的promise
对象的状态就由这个成功的回调
决定
这个成功的回调的执行结果抛出异常,就会将新promise
的状态变为rejected
这个新promise
的结果值就是抛出的错误
,可以调用新promise
的then()
方法,通过reason
拿到(因为它的状态是失败
的)
- 情况2:执行结果返回
非promise值
这里的then()
也是执行的是成功的回调
,那么then()
返回的一个新的promise
对象的状态就由这个成功的回调
决定
这个成功的回调的执行结果返回一个非promise
值,就会将新promise
的状态变为resolved
这个新promise
的结果值就是返回的值,可以调用新promise
的then()
方法,通过value
拿到(因为它的状态是成功的)
⚠️: 如果没有return
的语句,相当于return undefined
,和这种返回的是非promise
的任意值情况相同
- 情况3:执行结果返回
另一个promise对象
这里的then()
还是执行的是成功的回调
,那么then()
返回的一个新的promise
对象的状态就由这个成功的回调
决定
这个成功的回调的执行结果返回另一个promise对象
,那么then()
返回的promise
的状态就取决于这个promise
的状态,then()
返回的promise
的结果也就是这个promise
的结果
5. 如何串联多个操作任务?
promise
如何串联多个操作任务?
promise
的then()
返回一个新的promise
- 通过
then()
的链式调用串联多个同步/异步任务
第三个then()
方法会输出的value
值是undefined
,这个值实际上要看调用第三个then()
方法的promise对象
的成功值,也就是看它的前一个then()
方法。第二个then()
方法指定的回调中没有return
值,相当于return undefined
,就是说返回了一个非promise
值,像我们前面说的:那么第二个then()
方法返回的promise
是成功的promise
,成功的结果就是它返回的结果undefined
,这个成功值可以通过调用它的then()
方法获得,也就是调用了第三个then()
方法获得
解释有点绕,这样拆开来看:
6. 异常穿透
什么是promise的异常穿透?
- 当使用
promise
的then
链式调用时,可以在最后
指定失败的回调
- 前面任何操作出了异常,都会传到最后失败的回调用处理
最后用then()
也可以,但是因为不需要指定成功的回调,所以catch()
用得更多
成功的时候,没啥问题
失败的时候:
如果说前面有错误,不需要在前面处理错误,只要在最后放一个catch()
就行,错误就由最后的catch()
处理
7. 如何中断promise链
- 当使用
promise
的then
链式调用时,在中间中断,不再调用后面的回调函数 - 方法:在回调函数中返回一个
pending
状态的promise
对象
我们知道,then()
执行后返回的结果是一个promise
对象,这个新的promise
对象的状态由then()
指定的回调函数
的执行结果
决定
也就是第一个then()
这个时候只有返回一个pending
状态的promise
对象,才能使后面的then()
中的回调不再调用