乐趣区

关于javascript:Promise-链式调用

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

当一个 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
退出移动版