前言
Promise 是前端面试和工作中极其常见的一个概念,关于它各种方法的手写实现也很有市场,今天在这里总结一下 Promise 基本方法的简单实现。
catch() 方法
catch
方法是对 then
方法的封装,只用于接收 reject(reason)
中的错误信息。
因为在 then
方法中 onRejected
参数是可不传的,不传的情况下,错误信息会依次往后传递,直到有 onRejected
函数接收为止,因此在写 promise
链式调用的时候, then
方法不传 onRejected
函数,只需要在最末尾加一个 catch()
就可以了,这样在该链条中的 promise
发生的错误都会被最后的 catch
捕获到。
catch(onRejected) {
return this.then(null, onRejected);
}
done() 方法
catch
在 promise
链式调用的末尾调用,用于捕获链条中的错误信息,但是 catch
方法内部也可能出现错误,所以有些 promise
实现中增加了一个方法 done
。
done
相当于提供了一个不会出错的 catch
方法,并且不再返回一个 promise
,一般用来结束一个 promise
链。
done() {
this.catch(reason => {
console.log('done', reason);
throw reason;
});
}
finally() 方法
finally
方法用于无论是 resolve
还是 reject
, finall
y的参数函数都会被执行。
finally(fn) {
return this.then(value => {
fn();
return value;
}, reason => {
fn();
throw reason;
});
};
Promise.all() 方法
Promise.all
方法接收一个 promise
数组,返回一个新 promise2
,并发执行数组中的全部 promise
,所有 promise
状态都为 resolved
时, promise2
状态为 resolved
并返回全部 promise
结果,结果顺序和 promise
数组顺序一致。如果有一个 promise
为 rejected
状态,则整个 promise2
进入 rejected
状态。
static all(promiseList) {
return new Promise((resolve, reject) => {
const result = [];
let i = 0;
for (const p of promiseList) {
p.then(value => {
result[i] = value;
if (result.length === promiseList.length) {
resolve(result);
}
}, reject);
i++;
}
});
}
Promise.race() 方法
Promise.race
方法接收一个 promise
数组, 返回一个新 promise2
,顺序执行数组中的 promise
,有一个 promise
状态确定, promise2
状态即确定,并且同这个 promise
的状态一致。
static race(promiseList) {
return new Promise((resolve, reject) => {
for (const p of promiseList) {
p.then((value) => {
resolve(value);
}, reject);
}
});
}
Promise.resolve() 和 Promise.reject()
Promise.resolve
用来生成一个 rejected
完成态的 promise
, Promise.reject
用来生成一个 rejected
失败态的 promise
。
static resolve(value) {
let promise;
promise = new Promise((resolve, reject) => {
this.resolvePromise(promise, value, resolve, reject);
});
return promise;
}
static reject(reason) {
return new Promise((resolve, reject) => {
reject(reason);
});
}
总结
常用的方法基本就这些, Promise
还有很多扩展方法,这里就不一一展示,基本上都是对 then
方法的进一步封装,只要你的 then
方法没有问题,其他方法就都可以依赖 then
方法实现。
~
~ 本文完,感谢阅读!
~
学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。