持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
题外话
最近一直在研究手撕Promise,昨天晚上做梦都在写Promise实现,写到then方法实现的时候,怎么也达不到返回值,然后急哭了,就很离谱......
前情回顾
说回正题,上一篇中我们实现了Promise.resolve()、Promise.finnally(),其实到这里promise的一些方法九已经实现的差不多了,目前还有有个Promise.race()还没有实现,今天就来实现一下Promise.race()方法
正文
Promise.race()
老规矩,再实现一个方法之前我们首先需要知道这个方法都有哪些特性。
Promise.race实际上了Promise.all有点相像,不过他俩算是全完相反的两个方法。Promise.all是只要有一个promise状态是rejected,那么返回的结果就是失败的,只有全部状态都是成功的,返回的结果才能是成功。而Promise.race则是只要有一个promise执行完毕,就直接调用resolve并终止运行。
那么我们就来实现一下吧
- Promise.race也是接收一个数组作为参数
- 同样,数组里面的参数可以是普通值,也可以是promise对象
- 最终返回的结果是一个promise对象,是可以通过then方法链式调用的。
//1. 接收一个数组作为参数
Promise.Myrace = function(array) {
//2. 返回一个promise对象
return new Promise((resolve, reject) => {
//3. 对数组边界进行判断
if (!array.length) return
//4. 循环数组
for (let i = 0; i < array.length; i++) {
//4. 对所有参数都执行promise.resolve转换为promise对象
Promise.resolve(array[i]).then(resp => {
//5. 只要有一个promise执行完,就返回结果
return resolve(resp)
}, err => {
return reject(err)
})
}
})
}
关于promise的手撕方法到这里就结束了,因为再这几期的手撕promise系列里面,我们总常见new这个关键字,接下来我及说说我们再执行new一个函数的时候内部都做了什么,自己怎么实现一个new
实现一个new
老规矩,先知道执行new关键字的时候干了什么,接着再实现代码
- 先创建了一个新对象
- 将构造函数的显示原型绑定赋值给空对象的隐式原型
- 将this绑定到新的空对象上
- 如果构造函数没有返回非空对象,那么就返回空对象
function _new(constructor, ...args) {
let obj = {}
obj.__proto__ = constuctor.prototype
let result = constructor.call(obj, ...args)
return result instanceof Object ? result : obj
}
结束
今天是手撕Promise系列的完结篇,下周个更新什么,我也没想好,但是写不动了,下周见吧