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)=>{ }) 的⽅式 ⼀致。