MDN-Promise.prototype.then()
MDN-Promise.prototype.finally()
当一个 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