Promise 是前端面试和工作中极其常见的一个概念,关于它各种方法的手写实现也很有市场,今天在这里总结一下 Promise 基本方法的简单实现。
catch
方法是对 then
方法的封装,只用于接收 reject(reason)
中的错误信息。
因为在 then
方法中 onRejected
参数是可不传的,不传的情况下,错误信息会依次往后传递,直到有 onRejected
函数接收为止,因此在写 promise
链式调用的时候, then
方法不传 onRejected
函数,只需要在最末尾加一个 catch()
就可以了,这样在该链条中的 promise
发生的错误都会被最后的 catch
捕获到。
catch(onRejected) {
return this.then(null, onRejected);
}
catch
在 promise
链式调用的末尾调用,用于捕获链条中的错误信息,但是 catch
方法内部也可能出现错误,所以有些 promise
实现中增加了一个方法 done
。
done
相当于提供了一个不会出错的 catch
方法,并且不再返回一个 promise
,一般用来结束一个 promise
链。
done() {
this.catch(reason => {
console.log('done', reason);
throw reason;
});
}
finally
方法用于无论是 resolve
还是 reject
, finall
y的参数函数都会被执行。
finally(fn) {
return this.then(value => {
fn();
return value;
}, reason => {
fn();
throw reason;
});
};
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
数组, 返回一个新 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
用来生成一个 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
方法实现。
~
~ 本文完,感谢阅读!
~
学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!
相关推荐
© 2020 asciim码
人生就是一场修行