持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
题外话
本来就只打算写一个手撕Promise系列,我发现很多ES6之后新增的方法和属性,很多人都不是很清楚,那么首席Promise系列完结之后我就逐步开始更新一些新方法:比如Reflect,Proxy等等。
前情回顾
上一篇中我们使用了两种方式(一种使用了Promise.resolve(),一种是自行封装的方法)对Promise.all()进行的模拟实现,实现Promise.all()核心理念就是三点:
- 接收一个数组,返回一个promise对象,最终结果是一个数组
- 针对数组参数一定是都取到结果才回返回最终的结果
- 只有promise对象的状态都是true,最终结果才是true;只有有一个promise对象状态是false,那么最终结果也是false。
关于Promise.all()的复习就告一段落,如果没想起来或者没有理解透彻的,可以再返回去复习一遍
正文
今天我们来认识和手撕Promise.resolve()
Promise.resolve()
- 判断传入的参数是否是
promise对象,如果是promise对象就直接返回该参数 - 如果不是
promise对象,就将立即执行new Promise,再判断该参数是否已经有返回值,如果有就是用then方法获取返回值,如果没有就使用resolve进行调用
//1.定义自己的resolve方法
Promise.Myresolve = params => {
//2. 判断参数是否是promise对象,如果是promise对象就直接返回这个参数
if (param instanceof Promise) return param
//3. 如果是非promise对象,我们需要将这个参数变成一个promise对象再返回
return new Promise((resolve, reject) => {
//4. 判断这个参数是否有返回值,如果有返回值就需要调用then方法获取返回值
if (param && param.then && param.then === 'function') {
param.then(resolve, reject)
} else {
//5. 如果这个参数没有返回值就直接调用resolve
resolve(param)
}
})
}
Promise.prototype.finally()
无论
Promise是成功还是失败,调用finally之后都会执行finally中传入的函数,并且原封不动的往下传。finally回调函数不接受参数
//Promise.finally接收一个函数作为参数
Promise.Myfinnally = function(callback) {
//1. 调用传入的函数的then方法
this.then(resp => {
return Promise.resolve(callback()).then(resp => {
return resp
})
}, error => {
return Promise.resolve(callback()).then(() => {
throw error
})
})
}
结束
这一章里面我么介绍了Promise.all()和Promise.finnally()方法,下一篇我们将接收Promise.race()方法。