⾯试中,如何⼿写promi才能让⾯试官满意
导语:
你肯定使⽤过promi,但是你知道它是怎么实现的吗?它的原理是怎么样的?你能⼿写⼀个简单的promi吗?
在⾯试中你也可能会被问到⼿写⼀个promi,现在来直接⼿撕原理和代码吧!!
⼀,promi的状态
promi有三种状态:pending(进⾏中)、fulfilled(已成功)和rejected(已失败)。
⼀开始的时候就是pending,随后经过操作就会产⽣出另外两种状态fulfilled和rejected,并且可以通过这两个状态去调⽤不同的处理函数。
⼆,仅仅考虑resolve和reject
⾸先我们先写⼀个class的构造函数,并且把默认state设置为pending,它的value和reason设置为null。
class Promi{
constructor(executor){
this.state ='pending';//默认的状态,进⾏中
this.value =null;//成功后携带的值
function resolve(value){
if(this.state ==='pending'){
this.state ='fulfilled';
this.value = value;
}
};
function reject(reason){
if(this.state ==='pending'){
this.state ='rejected';
}
};
try{
executor(resolve, reject);//构造
}catch(err){
reject(err);
}
}
//then函数根据state来进⾏后续的回调函数操作
then(onFulfilled,onRejected){
if(this.state ==='fulfilled'){
onFulfilled(this.value);
};
if(this.state ==='rejected'){
ason);
};
if(this.state ==='pending'){
}
}
}
三,考虑能够链式then
如果要能够进⾏链式的then,那么肯定是要返回⼀个promi,才能够这样串联起来。所以我们要对刚刚的代码进⾏⼩⼩的修改,让then 执⾏回调函数的时候,返回⼀个promi。
class Promi{
constructor(executor){
this.state ='pending';//默认的状态,进⾏中
this.value =null;//成功后携带的值
function resolve(value){
if(this.state ==='pending'){
this.state ='fulfilled';
this.value = value;
}
};
function reject(reason){
if(this.state ==='pending'){
hody
this.state ='rejected';
}上海电力学院分数线
};
try{
executor(resolve, reject);//构造
}catch(err){
reject(err);
}
}kotte
//then函数根据state来进⾏后续的回调函数操作
then(onFulfilled,onRejected){
if(this.state ==='fulfilled'){
return new Promi((resolve, reject)=>{
onFulfilled(this.value)
})
};
if(this.state ==='rejected'){
return new Promi((resolve, reject)=>{
ason)
瑜伽怎么样})
};
if(this.state ==='pending'){
return new Promi((resolve, reject)=>{
})
}
}
}
这样写后,我们就可以进⾏链式操作,⽐如promi.then().then()…,这样⽆限串联,解决了回调函数的回调地狱问题。
四,考虑链式,也考虑then也可能是返回⼀个值
class Promi{
the originconstructor(executor){
this.state ='pending';//默认的状态,进⾏中
this.value =null;//成功后携带的值
function resolve(value){
if(this.state ==='pending'){
this.state ='fulfilled';
this.value = value;
};
function reject(reason){
if(this.state ==='pending'){
this.state ='rejected';
};
try{
executor(resolve, reject);//构造
}catch(err){
reject(err);
}
}
//then函数根据state来进⾏后续的回调函数操作
then(onFulfilled,onRejected){
if(this.state ==='fulfilled'){
return new Promi((resolve, reject)=>{
try{
let f =onFulfilled(lf.value)
if(f instanceof Promi){
f.then(resolve, reject)
}el{
resolve(f)
}
}catch(err){
reject(err)
}
})
};
if(this.state ==='rejected'){
return new Promi((resolve, reject)=>{
try{
let j =ason)
杭州一对一辅导if(j instanceof Promi){
j.then(resolve, reject)
}el{
resolve(j)
}
}catch(err){
reject(err)
}
})
};
if(this.state ==='pending'){
return new Promi((resolve, reject)=>{
电大学位英语考试let f =onFulfilled(lf.value)
if(f instanceof Promi){
f.then(resolve, reject)
}el{
resolve(f)
}
})
let j =ason)
if(j instanceof Promi){
j.then(resolve, reject)tbc是什么意思
}el{
resolve(j)
}
})
})
}
}
看动漫学日语}
这样的话promi也能返回⼀个值,并且被后续的then获取到。