Promise的实现原理(二)
1.在Promise的实现原理(一)中我们已经实现到同步的promise
class Mypromise {
// executor 执行者,也就是调用方传过来的函数,他是立即执行的
constructor(executor){
// 状态设置,因为promise 的状态是一旦改变就不允许返回的,我们已0为初始化状态
this.stateus= 0;
// executor又有两个回调函数,一个成功的函数resolve,一个失败的状态reject,首先定义这两个函数
// 使用者传回成功的value值
const resolve = (value)=>{
// 因为promise 的状态是不可逆的,因此这里需要更改status 的状态值
// 用户在.then 的时候,需要在把value值返回给用户,因此要把value暂存一下
this.successValue = value;
this.stateus=1;
}
// 使用者传回失败的value值
const reject= (value)=>{
// 同上
this.errorValue = value;
this.stateus=2;
}
executor(resolve,reject);
}
// success,error是用户传过来的回调函数
then(success,error){
// 因为promise 是一旦成就不允许失败的,或者一旦失败不允许成功,所以这里要判断一下
if(this.stateus===1){
success(this.successValue)
}
if(this.stateus===2){
error(this.errorValue)
}
}
}
1.2 当我们在Promise 中发一个ajax是,那我们现在这个代码就会出问题了,因为我们的代码的是同步的,ajax 是异步的。接下来我们解决如何解决Promise异步的事情。
1.2.1 简单使用
new Promise((resolve,reject)=>{
// 模拟异步
setTimeout(()=>{
resolve('成功')//3秒后返回成功字符串
},3000)
})
1.2.2 实现自己的异步
1.2.3 大概实现逻辑
①当用户调用.then时,因为是异步的,所有这个时候并没有调用resolve函数,所以此时的status的状态还处于0,
②当我们在.then中得到status的状态是0时,我们判断此时是一个异步的状态,解决此问题呢,我们可以把此时调用.then方法传过来的回调函数,存储在constructor中(this.successArray,this.errorArray),当我们异步完成任务调用resolve或者reject时,我们for循环当时存在constructor中的回调函数
class Mypromise {
// executor 执行者,也就是调用方传过来的函数,他是立即执行的
constructor(executor){
// 状态设置,因为promise 的状态是一旦改变就不允许返回的,我们已0为初始化状态
this.stateus= 0;
// 新增代码
// 异步的核心思想就是发布订阅,首先创建两个数组,分别来存储成功回调,以及失败的回调
this.successArray = [];
this.errorArray = [];
// 新增代码结束
// executor又有两个回调函数,一个成功的函数resolve,一个失败的状态reject,首先定义这两个函数
// 使用者传回成功的value值
const resolve = (value)=>{
// 因为promise 的状态是不可逆的,因此这里需要更改status 的状态值
// 用户在.then 的时候,需要在把value值返回给用户,因此要把value暂存一下
this.successValue = value;
this.stateus=1;
// 新增代码
// 循环调用.then时的回调函数
this.successArray.forEach(fn=>fn())
// 新增代码结束
}
// 使用者传回失败的value值
const reject= (value)=>{
// 同上
this.errorValue = value;
this.stateus=2;
// 新增代码
// 循环调用.then时的回调函数
this.successArray.forEach(fn=>fn())
// 新增代码结束
}
executor(resolve,reject);
}
// success,error是用户传过来的回调函数
then(success,error){
// 因为promise 是一旦成就不允许失败的,或者一旦失败不允许成功,所以这里要判断一下
if(this.stateus===1){
success(this.successValue)
}
if(this.stateus===2){
error(this.errorValue)
}
//新增代码
// 当用户调用.then 时,我们的status 处于0的状态
if(this.stateus===0){
// 这里我们push 一个函数,是因为我们可以在这个函数中可以扩展一些东西
this.successArray.push(()=>{
success(this.successValue)
});
this.errorArray.push(()=>{
error(this.errorValue)
});
}
// 新增代码结束
}
}
下一个文章(Promise的实现原理(三))讲解如何实现Promise 的链式调用。