这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
书接上回 认识Promise(二)
实例方法
catch()
catch 方法给Promise添加拒绝处理程序, 只有一个参数:onRejected(拒绝)处理程序。
这个方法就是一个语法糖,通过上一篇认识Promise(二) 中讲到的then实例方法可以发现,catch方法的作用就等价于 then(null, onRejected)。
let p = new Promise((resolve, reject)=> reject('我错了'));
let c1 = p.then(null,(e)=>console.log(e)) //我错了
let c2 = p.catch((e)=>console.log(e)) //我错了
catch 方法的返回值也是一个新的Primise实例,其行为与 Promise.prototype.then() 的 onRejected 处理程序是一样的。
finally()
finally 方法用于给期约添加onFinally处理程序。
它的特点是:其处理程序在Promise转换为解决或拒绝状态时都会执行。
这个方法可以避免 onResolved 和 onRejected 处理程序中出 现冗余代码。但 onFinally 处理程序没有办法知道期约的状态是解决还是拒绝,所以这个方法主要用于添加清理代码。
let p1 = Promise.resolve('哈哈');
let p2 = Promise.reject('我错了');
let f1 = p1.finally((e) => console.log('finally1',e)); // finally1 undefined
let f2 = p2.finally((e) => console.log('finally2',e)); // finally2 undefined
//Uncaught (in promise) 我错了
//对比then/catch
let t1 = p1.then((e) => console.log(e)); // 哈哈
let c1 = p1.catch((e) => console.log(e)); //
let c2 = p2.catch((e) => console.log(e)); // 我错了
从上面可以看出:
- Promise状态无论是落定为解决还是拒绝;
finally方法都执行 finally方法不管它父期约的解决值,都输出为undefinedfinally方法同样是返回一个新的Promise实例。但是它跟then()或 catch()方式返回的实例不同。一般情况下它表现为传递父期约,这怎么说?如下
let p = Promise.resolve('哈哈');
let p1 = p.finally();
let p2 = p.finally(() => undefined);
let p3 = p.finally(() => {});
let p4 = p.finally(() => Promise.resolve());
let p5 = p.finally(() => 'bar');
let p6 = p.finally(() => Promise.resolve('阿巴阿巴'));
let p7 = p.finally(() => Error('Error'));
// 以上p1 - p7 都是 Promise <resolved>: foo
不管是不给处理程序,还是抛出解决的Promise对象,finally 方法始终返回的新的Promise实例(表现结果同它父级一样)
那么不一般的情况呢?以下情况
let p = Promise.resolve('哈哈');
let p1 = p.finally(() => new Promise(() => {})); // 返回待定Promise
let p2 = p.finally(() => Promise.reject()); // 返回拒绝的
let p3 = p.finally(() => { throw '出错了'; }); // 抛出错误