本文最后更新于:8 个月前
Promise的3种实例方法介绍、手写实现
Promise实例方法
Promise实例方法定义在Promise原型上
一、then()
then()是为Promise实例添加处理程序的主要方法
1 2 3 4 5 6 7 8 9 10
| var p = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('success') },1000) })
p.then((result)=>{console.log('1',result)}) p.then((res)=>{console.log('2',res)})
|
1.参数
- 参数一:onResolved函数,可选
- 参数二:onRejected函数,可选
注意:如果传入的参数为非function类型,会被忽略。
1 2 3 4 5 6 7
| let p = new Promise((resolve,reject)=>{...}) function onResolved(){...} function onRejected(){...}
p.then(onResolved) p.then(null, onRejected) p.then(onResolved, onRejected)
|
2.返回值
then方法返回一个新的Promise实例。这个新的Promise实例是会自动被Promise.resolve方法包装。
返回值的状态需要根据不同情况进行区分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var p = new Promise(()=>{}) var p1 = p.then(()=>'bar') var p2 = p.then(()=>{throw 'err'}) var p3 = p.then(()=>Promise.resolve('bar')) var p4 = p.then(()=>Promise.reject('foo')) p1 p2 p3 p4
var p = new Promise(()=>'bar') var p1 = p.then(()=>{}) p1
|
父级Promise实例状态为pending
时,then()返回的所有实例都是对父级Promise实例的继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var p = Promise.resolve('init') var p0 = p.then(()=>{}) var p1 = p.then(()=>'bar') var p2 = p.then(()=>{throw 'err'}) var p3 = p.then(()=>Promise.reject()) var p4 = p.then(()=>new Promise(()=>{})) var p5 = p.then() p p0 p1 p2 p3 p4 p5
|
then()返回的实例是 Promise.resolve()
方法 对onResolved
处理程序的返回值 的包装。
如果没有提供onResolved
处理程序,返回的是Promise.resolve()
对父级Promise实例的包装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var p = Promise.reject('init') var p1 = p.then() var p2 = p.then(null, ()=>{}) var p3 = p.then(null, ()=>'bar') var p4 = p.then(null, ()=>{throw 'err'}) var p5 = p.then(null, ()=>{return new Promise(()=>{})}) var p6 = p.then(null, ()=>Promise.resolve('bar')) var p7 = p.then(null, ()=>Promise.reject('bar')) p1 p2 p3 p4 p5 p6 p7
|
then()返回的实例是Promise.resolve()
方法对onRejected
处理程序返回值 的包装
如果没有提供onRejected
处理程序,则返回Promise.resolve()
对父级Promise实例的包装
二、catch()
catch()用于为 Promise实例 添加 onRejected 处理程序,它是一个语法糖,catch(onRejected) 相当于 then(null, onRejected)
1.参数
只接受一个参数,onRejected
处理函数
1 2
| var p = Promise.reject('err') var p1 = p.catch((err)=>{console.log(err)})
|
1 2 3
| var p = new Promise((resolve,reject)=>{...}) p.then(()=>{...}) .catch(()=>{...})
|
2.返回值
Promise实例,与 then() 的 onRejected
处理程序一致(即父级Promise实例状态为rejected
时)
1 2 3 4 5
| var p = Promise.reject('err') var p1 = p.catch((err)=>{console.log(err)}) var p2 = p.catch() p1 p2
|
1 2 3 4 5 6
| var p = Promise.resolve('init') var p1 = p.catch() var p2 = p.catch((err)=>{console.log(err)}) p1 p2
|
- 如果没有传入
onRejected
处理函数,返回Promise.resolve()
对父级Promise实例的包装
- 否则,返回
Promise.resolve()
对onRejected
处理函数的返回值的包装
三、finally()
finally() 用于给Promise实例添加 onFinally 处理程序,这个处理程序会在状态发生转换(pending -> resolved 或 pending -> rejected)时执行,它存在的意义在于避免 onResolved 和 onRejected 处理程序中出现重复冗余的代码
1.参数
接受一个函数作为参数
1 2 3 4
| var p = new Promise((resolve, reject)=>{...}) p.then(()=>{...}) .catch(()=>{...}) .finally(()=>{...})
|
2.返回值
新的Promise实例,大多数情况下表现为对父级Promise实例的传递,对于解决和拒绝状态都是,不会被改变。(onFinally处理程序抛出异常时除外)
1 2 3 4 5 6 7
| let p1 = Promise.resolve('foo'); let p2 = Promise.reject('bar'); let p3 = p1.finally(()=>'qux'); let p5 = p2.finally(()=>'qux');
let p4 = p2.finally(()=>{throw 'err'});
|