MDN-Promise.prototype.then()
MDN-Promise.prototype.finally()
【Promise|Promise 链式调用】当一个 Promise 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:
- 返回了一个值,那么 then 返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
- 没有返回任何值,那么 then 返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined。
- 抛出一个错误,那么 then 返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
- 返回一个已经是接受状态的 Promise,那么 then 返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
- 返回一个已经是拒绝状态的 Promise,那么 then 返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
- 返回一个未定状态(pending)的 Promise,那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。
var p1 = function() {
return new Promise((rs, rj) => {
setTimeout(() => {rs('p1')}, 1000)
})
}var p2 = function() {
return new Promise((rs, rj) => {
setTimeout(() => {rs('p2')}, 500)
})
}var pp = function() {
return p1().then(resP1 => {
console.log('pp > p1 > then')
return p2().then(resP2 => {
console.log('pp > p2 > then')
return resP2
}).finally(() => {console.log('pp > p2 > finally')})
}).finally(() => {console.log('pp > p1 > finally')})
}pp().then(resPP => {
console.log('pp() > then')
console.log(resPP)
})// log:
// pp > p1 > then
// pp > p2 > then
// pp > p2 > finally
// pp > p1 > finally
// pp() > then
// p2