Promise|Promise 链式调用

MDN-Promise.prototype.then()
MDN-Promise.prototype.finally()

【Promise|Promise 链式调用】当一个 Promise 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:
  1. 返回了一个值,那么 then 返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
  2. 没有返回任何值,那么 then 返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined。
  3. 抛出一个错误,那么 then 返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
  4. 返回一个已经是接受状态的 Promise,那么 then 返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
  5. 返回一个已经是拒绝状态的 Promise,那么 then 返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
  6. 返回一个未定状态(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

    推荐阅读