promsie/A+规范笔记
1.promise是一个实例, 可理解为let promise=Promise(executor) 其中executor可以看做是一个执行,当new一个promise的时候就自动执行executor的内容。
2.执行器函数包含两个参数,一个叫做reject,一个叫做resolve
3.一个promise里面包含三个状态,pending、fulfilled、rejected,状态fulfilled和rejected一旦进入就不可改变
4.在then里面也包含两个参数,两个参数都是函数并且不可被实例化,也不能有this的指向。
5.当调用成功时,在resolve里面改变状态,失败同理。
6.处理异步的调用,采用发布订阅者模式,因为状态未改变,所以需要在then里面增加处理PENDING状态的方法,将所有成功和失败的回调都分别存进数组里面。发布的时候是异步的方法被调用时发布,直接在resolve和reject里面进行发布,同时里面有对value和reson的赋值,因此发布的函数直接执行会采用这个函数里面的值进行执行。
以下是简单的promise实现的源码(未处理链式调用)
let PENDING='PENDING',
FULFILLED='FULFILLED',
REJECTED='REJECTED'
class Mypromise{
constructor(executor){
this.status=PENDING;//初始化状态
this.value=undefined;//初始化value
this.reson=undefined;//初始化reson
this.allFulfilledCallbacks=[] //用来保存成功回调
this.allRejectCallbacks=[] //用来保存失败的回调
//成功的回调
const resolve=(value)=>{
if(this.status===PENDING){
this.status=FULFILLED//将状态改变
this.value=value
//发布过程
this.allFulfilledCallbacks.forEach(func=>func())
}
}
//失败的回调
const reject=(reson)=>{
if(this.status===PENDING){
this.status=REJECTED//将状态改变
this.reson=reson
this.allRejectCallbacks.forEach(func=>func())
}
}
//异常捕获,并且改变状态,实现异常走reject
try{
executor(resolve,reject)
}
catch(err){
this.status=REJECTED
this.reson=err
}
}
then(onFulfilled,onRejected){
if(this.status===FULFILLED){
onFulfilled(this.value)
}
if(this.status===REJECTED){
onRejected(this.reson)
}
//处理异步的情况
if(this.status=PENDING){
//采用发布订阅者模式
//订阅过程
this.allFulfilledCallbacks.push(()=>{
onFulfilled(this.value)
})
this.allRejectCallbacks.push(()=>{
onRejected(this.reson)
})
}
}
}