面试 实现手写 promise (一)
1.promise是一个构造函数,需要使用new来实例化
2.promise 有两个回调函数 resolve(成功) reject(失败) 来返回的内容
点击查看代码
class promise {
constructor(response){
//成功
let resolve=()=>{ }
//失败
let reject=()=>{ }
response(resolve,reject)
}
}
3.内部存在三种状态state :pending(初始)、fulfilled(完成)、rejected(失败)
一但 状态到fulfilled/rejected,是不可逆转的,存在不可改变的值/失败原因
4.返回值:完成时 会在resolve中返回value值,状态state会被修改成fulfilled完成
失败时 会在reject中返回失败原因,状态state会被修改成rejected完成
存在一种特需情况就是:返回函数的报错的情况 直接reject(err)
点击查看代码
class promise {
constructor(response){
let state='pending' //状态
let value //成功返回值
let errject //失败返回原因
//成功
let resolve=(value)=>{
//阻止逆向修改状态值
if(this.state=='pending'){
this.state='fulfilled' //修改state
this.value=value //储存成功的值
}
}
//失败
let reject=(errject)=>{
//阻止逆向修改状态值
if(this.state=='pending'){
this.state='rejected' //修改state
this.errject=errject //储存失败的原因
}
}
try{
response(resolve,reject)
} catch (err) {
reject(err);
}
}
}
5..then方法的实现: promise.then(onFulfilled, onRejected) 最终会在onFulfilled中返回成功的值,onRejected中返回失败的原因
点击查看代码
class promise {
constructor(response){
let state='pending' //状态
let value //成功返回值
let errject //失败返回原因
//成功
let resolve=(value)=>{
//阻止逆向修改状态值
if(this.state=='pending'){
this.state='fulfilled' //修改state
this.value=value //储存成功的值
}
}
//失败
let reject=(errject)=>{
//阻止逆向修改状态值
if(this.state=='pending'){
this.state='rejected' //修改state
this.errject=errject //储存失败的原因
}
}
try{
response(resolve,reject)
} catch (err) {
reject(err);
}
}
then(onFulfilled, onRejected){
if(this.state === 'fulfilled'){ //完成时 返回值
onFulfilled(this.value)
}
if(this.state === 'rejected'){ //失败时 返回原因
onRejected(this.errject)
}
}
}
存在问题:1.当 promise 内部使用到异步操作时(定时器、网络请求),then方法调用的时候,promise内部的state还是pending状态,导致then获取的没有值
思路:当then的时候 状态为pending时 将 回调函数 的外面一层封装一个函数的调用,在resolve/reject中调用。
可参考观察者模式
2.实现链式调用 new Promise().then().then()
实现链式调用,需要返回一个新的promise/普通值 都要返回到下一个then中