1.关于then
then方法的作用是为Promise对象添加状态改变时的回调函数。
2.then的返回值
then()方法的返回值也是一个promise对象,所以它支持链式写法。但是要注意的是它的返回值是一个新的promise对象,与调用then方法的并不是同一个对象。
那么既然 p2也是一个promise对象,那么,p2的状态(promiseStatus)和值(promiseValue)又由什么决定呢?我们先上结论,随后分别逐一验证。
3.p2的状态和值的确定规则
(1)当p1的状态是pending,则p2的状态也是pending
如前面所示代码
(2)当p1的状态是resolved,then()会去执行f_ok,则p2的状态由f_ok的返回值决定。
(2).1如果f_ok返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是 f_ok函数的return值。
(2).2如果f_ok返回值是promise对象,则p2的状态及promiseValue以这个promise对象为准。
(2).3如果f_ok这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是 rejected,且p2的promiseValue就是这个错误对象。
(3)如果p1的状态是rejected,then()会去执行f_err,则p2的状态由f_err的返回值决定。
(3).1如果f_err返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是 f_err函数的return值。
(3).2如果f_err返回值是一个promise对象,则p2的状态及promiseValue以该promise对象为准。
(3).3如果f_err这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是 rejected,且p2的promiseValue就是这个错误对象。