Promise.prototype._resolve = function(data){
if(data instanceof Promise){
return data;
}
if(data.then){
return new Promise((resolve, reject) => {
data.then(resolve, reject);
})
}
return new Promise(resolve => {
resolve(data);
})
}
Promise.prototype._reject = function(err){
return new Promise((_, reject) => {
reject(err);
})
}
Promise.prototype._all = function (promises) {
return new Promise((resolve, reject) => {
let count = promises.length
let result = []
// 遍历 promises,如果成功,count--,将成功值存入数组,如果失败直接 reject,当计数器为0时,resolve结果
promises.forEach((promise, index) => {
Promise.resolve(promise).then(res => {
--count
// 每个 promise 的结果放在其对应位置上
result[index] = res
if (count === 0) {
resolve(result)
}
}).catch(err => {
reject(err)
})
})
})
}
// race 采用第一个执行完的promise的结果,其他还是会执行,但是不纪录结果
Promise.prototype._race = function (promises) {
return new Promise((resolve, reject) => {
// 直接遍历 promises,有成功或失败都立即返回
promises.forEach((promise) => {
// 此处借用 Promise.resolve 将传入的每一个都 promise化,使其拥有 .then 方法
Promise.resolve(promise).then(
res => {resolve(res)},
err => {reject(err)}
);
})
})
}
// catch是不过reject回调,相当于不给then传入成功的回调函数
Promise.prototype._catch = function (onRejected) {
return this.then(null, onRejected)
};
// finally 执行结束返回的是FULFILLED状态的promise
Promise.prototype._finally = function (callback) {
// 这里resolve的实际上是callback()方法执行的返回值
return this.then(
value => Promise.resolve(callback()).then(() => value),
reason => Promise.resolve(callback()).then(() => { throw reason })
);
};
前端手撕代码——手撕promise其他方法
最新推荐文章于 2024-08-10 14:32:18 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)