一、如何改变promise的状态
1、调用resolve,状态变为resolved
2、调用reject,状态变为rejected
3、throw,状态变为rejected
二、promise指定多个成功/失败的回调函数,是否都会调用
promise在实现上,会把多个回调函数都保存起来,也就是都会调用
//同一个promise p,当其状态变为resolved后,1和2都会打印
p.then(
value=> {
console.log(1)
},
reason=> {
}
)
p.then(
value=> {
console.log(2)
},
reason=> {
}
)
三、改变promise状态和指定回调函数,谁先谁后?
都可以,这样promise的异步处理使用起来更灵活些
//执行器函数体中的代码是同步的
//1、先改变状态,后指定回调
new Promise((resolve,reject)=>{
resolve(1)
}).then(
value=>{},
reason=>{},
)
//2、先指定回调,后改变状态
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(1)
},1000)
}).then(
value=>{},
reason=>{},
)
四、promise.then()返回的新promise的结果状态由什么决定?
1、简单表述:由then()中被执行的回调函数,所执行的结果决定
2、详细描述:
a、抛出异常,新promise变为rejected的状态,reason为抛出的异常
b、如果返回的是非promise,新promise变为resolved状态,value为return的值
c、如果返回的是一个promise,此promise的结果就会成为新promise的结果
五、promise的异常传透
p.then(
value=>{},
//这里没有写失败回调,会自动补充如下代码
//reason=>{throw reason} 或者 reason=> Promise.reject(reason)
).then(
value=>{},
//这里没有写失败回调,会自动补充如下代码
//reason=>{throw reason} 或者 reason=> Promise.reject(reason)
).catch(
reason=>{}
)
1、promise的异常传透是指,当使用promise的then链式调用时,即使没有在then中指定失败的回调函数,也可以在最后指定失败的回调,使用catch。
2、前面任何操作出了异常,中途没有被处理,都会传到最后的catch中
六、如何中断promise的链式调用
1、要知道:catch之后可以继续then
p.catch(
reason=>{}
).then(
value=>{},
reason=>{},
)
2、如何操作,中断promise的链式调用
在被执行的回调函数体中返回一个pending状态的promise
return new Promise(()=>{})