promise的實現

1.promise的聲明

首先promise是一個類,那麼就用 class聲明。

  • 由於new promise((resolve,reject)=>{}),所以傳入一個參數,我們叫它executor,傳入立即執行。
  • resolved、reject可執行,所以都是函數,我們用let聲明。
class promise{
  constructor(executor){

let resolve=()=>{};
let reject=()=>{};
  
}
}

2.promise的狀態

解決完聲明應該解決狀態了!

  • promise有三種狀態,fulfilled、pending、rejected
  • pending是初始狀態
  • 成功時,不可轉爲其他狀態,必須有一個不可改變的值value
  • 失敗時,不可轉入其他狀態,必須有失敗的原因reason
  • 成功時:new promise((resolve,reject)=>{resolve(this.value)})
  • 失敗時:new promise((resolve,reject)=>{reject(this.reason)})
  • 如果executor報錯,直接執行reject
class promise{
 constructor(executor){
 //初始化state
 this.state='pending';
 //成功的值
 this.value=undefiend;
 //失敗的值
 this.reason=undefined;
 //成功的話 改變狀態存儲值
 let resolve=(value)=>{
 //如果是pending,執行resolve後 狀態改爲fulfilled
    if(this.state==='pending'){
       this.state==='fulfilled';
       //存儲成功的值
        this.value=value;
}
  
}
//失敗的話 轉變狀態存儲原因
let reject=(reason)=>{
  if(this.state==='pending'){
    this.state==='rejected';
    this.reason=reason;
}

};
//如果executor有錯 就直接執行reject
try{
 executor(resolve,reject);
}catch(err){
  reject(err);
}

}

}

3.promise的方法then

定義和狀態都寫完了,那方法呢!

  • promise有個then方法,裏面有兩參數:onfulfilled,onrejected
  • 當state爲fulfiiled則執行onfulfilled,傳入this.value,當state爲rejected則執行onrejected,傳入this.reason
class promise{
 constructor(executor){
 //2.狀態
 //初始化state
 this.state='pending';
 //成功的值
 this.value=undefiend;
 //失敗的值
 this.reason=undefined;
 //成功的話 改變狀態存儲值
 let resolve=(value)=>{
 //如果是pending,執行resolve後 狀態改爲fulfilled
    if(this.state==='pending'){
       this.state==='fulfilled';
       //存儲成功的值
        this.value=value;
}
  
}
//失敗的話 轉變狀態存儲原因
let reject=(reason)=>{
  if(this.state==='pending'){
    this.state==='rejected';
    this.reason=reason;
}

};
//如果executor有錯 就直接執行reject
try{
 executor(resolve,reject);
}catch(err){
  reject(err);
}
}

//3.then方法
then(onFulfilled,onRejected){
  if(this.state==='fulfilled'){
  onFulfilled(this.value);
};
if(this.state==='rejected'){
  onRejected(this.reason);
}
}
}

4.promise封裝ajax

function ajax(url){
     return new Promise((resolve,reject)=>{
   var xhr=new XMLHttprequest();
   xhr.open('GET',url,true);
   xhr.onreadystateChange=function(){
    if(this.readyState===4&&this.status===200){
     resolve(this.responseText,this)
}else{
  var errMsg={"code":this.status,"msg":"請求接口失敗"}
  reject(errMsg);
}

}
xhr.send();
}).then((response)=>{
 console.log('resolve處理成功接收的數據:',response)
},err=>{
  console.log('reject處理的錯誤信息:',err)
})

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章