promise中then解析

279 阅读3分钟

then的格式及执行逻辑

then方法的作用是为promiss对象添加状态改变时的回调函数

promiss对象有三种状态:

pending(等待中)
resolve(成功)
reject(失败)

then的格式

它有两个参数,每个参数都是函数。 第⼆个参数是可选的。
// p 是⼀个promise对象

p.then(函数1[,函数2])

它的两个参数都是函数。

第⼀个参数是resolved状态的回调函数。当p的状态从pending变成了resolved,函数1会执⾏。

第⼆个参数是rejected状态的回调函数。 当p的状态从pending变成了rejected,函数2会执⾏。

其中第⼆个参数是可选的,如果只写⼀个参数的话就是如下:

promise对象.then(函数1)

如果promise对象的状态是rejected,且此时then⽅法并没有设置第⼆个参数,就会向外抛

出⼀个错误,错误的提示⼤约是 Uncaught (in promise) 。

then的返回值(难点)

then()⽅法的返回值也是⼀个promise对象,所以它⽀持链式写法。但是要注意的是它的返回值是⼀个新

的promise对象,与调⽤then⽅法的并不是同⼀个对象。

看下如下代码:

var p1 = new Promise(()=>{});

var p2 = p1.then(function f_ok(){}, function f_err(){});

// p2也是⼀个promise对象。

console.log(p1 === p2); // false

如上代码可以说明p1.then()的结果是⼀个与p1不同的promise对象。换句话说,then()会封装⼀个全新

的promise对象p2。那既然 p2也是⼀个promise对象,那么,p2的状态(

promiseStatus)和值

(promiseValue)分别是什么?

p2的状态及promiseValue如何确定?

p2的状态及promiseValue按如下规则来确定

如果p1的状态是pending,则p2的状态也是pending。

如果p1的状态是resolved,then()会去执⾏f_ok,则p2的状态由f_ok的返回值决定。

如果f_ok返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_ok函数的return值。

如果f_ok返回值是⼀个promise对象,则p2的状态及promiseValue以这个promise对象为准。

如果f_ok这个函数内部发⽣了错误(或者是⽤户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

如果p1的状态是rejected,then()会去执⾏f_err,则p2的状态由f_err的返回值决定。

如果f_err返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_err函数的return值。

如果f_err返回值是⼀个promise对象,则p2的状态及promiseValue以这个promise对象为准。

如果f_err这个函数内部发⽣了错误(或者是⽤户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

catch的格式及⽤法

catch 是 then(null, reject)的别名

catch()的格式及⽤法

Promise.prototype.catch 是 Promise.prototype.then(null, reject)的别名,⽤于指定当promise对象的

状态从pending变成rejected的回调函数 。

单独使⽤catch没有什么意义,它⼀般与then⼀块使⽤。

catch的返回值

catch的返回值仍是⼀个promise对象,确定它的值的⽅式与 then(null,(errVal)=>{ }) 的⽅式 ⼀致。