携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
前言
本篇将讲解Promise.resolve以及Promise.reject的细则以及实现,希望通过阅读这篇文章能让你完全掌握。
阅读这篇文章,需要你掌握的知识👇
- Promise基本知识
其中Promise基础知识如果不了解或有遗忘的同学可以参考我这篇文章:《简单明了的Promise基本知识点》
什么是Promise.resolve?
Promise.resolve作为Promise类向外部暴露的api,Promise.resolve(value) 将给定的一个值转为Promise对象。其中对于参数value的类型不同,会有以下几种处理方式:
- 如果
value是一个promise,那么将返回这个promise;
- 如果
value是thenable(即带有"then"方法的对象),在返回的Promise中执行value的then方法。
- 否则返回的promise将以
value完成,即以此值执行resolve()方法。
实现Promise.resolve
function myResolve(value){
if (value instanceof Promise){
//如果`value`是一个` promise` ,那么将返回这个 `promise`
return value
}else if(value instanceof Object && 'then' in value){
return new Promise((resolve,reject)=>{
//如果`value`是`thenable`(即带有`"then" `方法的对象),在返回的Promise中执行`value`的`then`方法。
value.then(resolve,reject)
})
}else{
//否则返回的promise将以`value`完成,即以此值执行`resolve()`方法。
return new Promise((resolve)=>{
resolve(value)
})
}
}
测试代码
const promise1 = myResolve(123);
promise1.then((value) => {
console.log(value);
// expected output: 123
});
// Resolve一个thenable对象
var p1 = myResolve({
then: function (onFulfill) {
onFulfill("Resolving");
}
});
console.log(p1 instanceof Promise) // true, 这是一个Promise对象
setTimeout(() => {
console.log('p1 :>> ', p1);
}, 1000);
p1.then(function (v) {
console.log(v); // 输出"fulfilled!"
}, function (e) {
// 不会被调用
});
// Thenable在callback之前抛出异常
// myPromise rejects
var thenable = {
then: function (resolve) {
throw new TypeError("Throwing");
resolve("Resolving");
}
};
var p2 = myResolve(thenable);
p2.then(function (v) {
// 不会被调用
}, function (e) {
console.log(e); // TypeError: Throwing
});
控制台结果:
true
123
Resolving
TypeError: Throwing
p1 :>> Promise { 'Resolving' }
如果你的输出结果和以上一致,就代表测试通过了🤩
什么是Promise.reject?
Promise.reject作为Promise类向外部暴露的api,
Promise.reject接收一个参数,并将这个参数作为拒绝执行的原因执行,即:reject(value)
实现Promise.reject
function myReject(value){
return new Promise((resolve,reject)=>{
reject(value)
})
}
测试代码
let promise1 = myReject(new Error('no why'))
let promise2 = myReject(2)
控制台结果👇
Promise {
<rejected> Error: no why
}
Promise { <rejected> 2 }
如果你的输出结果和以上一致,就代表测试通过了🤩
尾声
这俩个api的实现较为简单,我就合着一篇文章一起讲解了。越写越发现实现Promise系列的难点是去记这么多规则了,希望同学们牢记规则。