成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

JavaScript基礎教程之怎么實現(xiàn)一個簡單的promise-創(chuàng)新互聯(lián)

這篇文章主要介紹JavaScript基礎教程之怎么實現(xiàn)一個簡單的promise,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

公司主營業(yè)務:成都網(wǎng)站設計、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出烏翠免費做網(wǎng)站回饋大家。

前言

我們在開發(fā)過程中大多會用到promise,想必大家對promise的使用都很熟練了,今天我們就來實現(xiàn)一個簡單的promise,實現(xiàn)的效果如有出入還往指正。

Promise/A+規(guī)范:

  • 首先重新閱讀了下A+的規(guī)范:

  • promise代表了一個異步操作的最終結(jié)果,主要是通過then方法來注冊成功以及失敗的情況,

  • Promise/A+歷史上說是實現(xiàn)了Promise/A的行為并且考慮了一些不足之處,他并不關心如何創(chuàng)建,完成,拒絕Promise,只考慮提供一個可協(xié)作的then方法。

術語:

  • promise是一個擁有符合上面的特征的then方法的對象或者方法。

  • thenable是定義了then方法的對象或者方法

  • value是任何合法的js的值(包括undefined,thenable或者promise)

  • exception是一個被throw申明拋出的值

  • reason是一個指明了為什么promise被拒絕

整體結(jié)構(gòu)

我們先來梳理一下整體的結(jié)果,以便后續(xù)好操作

class MyPromise {
 constructor(fn){
 
 }
 resolve(){

 }
 then(){

 }
 reject(){

 }
 catch(){

 }
}

Promise理論知識

摘抄至 http://es6.ruanyifeng.com/#docs/promise#Promise-all

Promise對象有以下兩個特點。

(1)對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失?。?。只有異步操作的結(jié)果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。

(2)一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果,這時就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對Promise對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監(jiān)聽,是得不到結(jié)果的。

總結(jié)一下就是promise有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失?。?,還有就是狀態(tài)的改變只能是pending -> fulfilled 或者 pending -> rejected,這些很重要

實現(xiàn)構(gòu)造函數(shù)

現(xiàn)在我們開始實現(xiàn)構(gòu)造函數(shù)

class MyPromise {
 constructor(fn){
 if(typeof fn !== 'function') {
  throw new TypeError(`MyPromise fn ${fn} is not a function`)
 }
 this.state = 'pending';
 this.value = void 0;
 fn(this.resolve.bind(this),this.reject.bind(this))
 }
 ...
}

構(gòu)造函數(shù)接收一個參數(shù)fn,且這個參數(shù)必須是一個函數(shù),因為我們一般這樣使用new Promise((resolve,reject)=>{});
然后初始化一下promise的狀態(tài),默認開始為pending,初始化value的值。

fn接收兩個參數(shù),resolve、reject

resolve

class MyPromise {
 constructor(fn){
 if(typeof fn !== 'function') {
  throw new TypeError(`MyPromise fn ${fn} is not a function`)
 }
 this.state = 'pending';
 this.value = void 0;
 fn(this.resolve.bind(this),this.reject.bind(this))
 }
 resolve(value){
 if(this.state !== 'pending') return;
 this.state = 'fulfilled';
 this.value = value
 }
 ...
}

當resolve執(zhí)行,接收到一個值之后;狀態(tài)就由 pending -> fulfilled;當前的值為接收的值

reject

class MyPromise {
 constructor(fn){
 if(typeof fn !== 'function') {
  throw new TypeError(`MyPromise fn ${fn} is not a function`)
 }
 this.state = 'pending';
 this.value = void 0;
 fn(this.resolve.bind(this),this.reject.bind(this))
 }
 resolve(value){
 if(this.state !== 'pending') return;
 this.state = 'fulfilled';
 this.value = value
 }
 reject(reason){
 if(this.state !== 'pending') return;
 this.state = 'rejected';
 this.value = reason
 }
}

當reject執(zhí)行,接收到一個值之后;狀態(tài)就由 pending -> rejected;當前的值為接收的值

then

class MyPromise {
 constructor(fn){
 if(typeof fn !== 'function') {
  throw new TypeError(`MyPromise fn ${fn} is not a function`)
 }
 this.state = 'pending';
 this.value = void 0;
 fn(this.resolve.bind(this),this.reject.bind(this))
 }
 resolve(value){
 if(this.state !== 'pending') return;
 this.state = 'fulfilled';
 this.value = value
 }
 reject(reason){
 if(this.state !== 'pending') return;
 this.state = 'rejected';
 this.value = reason
 }
 then(fulfilled,rejected){
 if (typeof fulfilled !== 'function' && typeof rejected !== 'function' ) {
  return this;
 }
 if (typeof fulfilled !== 'function' && this.state === 'fulfilled' ||
  typeof rejected !== 'function' && this.state === 'rejected') {
  return this;
 }
 return new MyPromise((resolve,reject)=>{
  if(fulfilled && typeof fulfilled === 'function' && this.state === 'fulfilled'){
  let result = fulfilled(this.value);
  if(result && typeof result.then === 'function'){
   return result.then(resolve,reject)
  }else{
   resolve(result)
  }
  }
  if(rejected && typeof rejected === 'function' && this.state === 'rejected'){
  let result = rejected(this.value);
  if(result && typeof result.then === 'function'){
   return result.then(resolve,reject)
  }else{
   resolve(result)
  }
  }
 })
 }
}

then的實現(xiàn)比較關鍵,首先有兩個判斷,第一個判斷傳的兩個參數(shù)是否都是函數(shù),如果部不是return this執(zhí)行下一步操作。
第二個判斷的作用是,比如,現(xiàn)在狀態(tài)從pending -> rejected;但是中間代碼中有許多個.then的操作,我們需要跳過這些操作執(zhí)行.catch的代碼。如下面的代碼,執(zhí)行結(jié)果只會打印1

new Promise((resolve,reject)=>{
 reject(1)
}).then(()=>{
 console.log(2)
}).then(()=>{
 console.log(3)
}).catch((e)=>{
 console.log(e)
})

我們繼續(xù),接下來看到的是返回了一個新的promise,真正then的實現(xiàn)的確都是返回一個promise實例。這里不多說

下面有兩個判斷,作用是判斷是rejected還是fulfilled,首先看fulfilled,如果是fulfilled的話,首先執(zhí)行fulfilled函數(shù),并把當前的value值傳過去,也就是下面這步操作,res就是傳過去的value值,并執(zhí)行了(res)=>{console.log(res)}這段代碼;執(zhí)行完成之后我們得到了result;也就是2這個結(jié)果,下面就是判斷當前結(jié)果是否是一個promise實例了,也就是下面注釋了的情況,現(xiàn)在我們直接執(zhí)行resolve(result);

new Promise((resolve,reject)=>{
 resolve(1)
}).then((res)=>{
 console.log(res)
 return 2
 //return new Promise(resolve=>{})
})

剩下的就不多說了,可以debugger看看執(zhí)行結(jié)果

catch

class MyPromise {
 ...
 catch(rejected){
  return this.then(null,rejected)
 }
}

完整代碼

class MyPromise {
 constructor(fn){
  if(typeof fn !== 'function') {
   throw new TypeError(`MyPromise fn ${fn} is not a function`)
  }
  this.state = 'pending';
  this.value = void 0;
  fn(this.resolve.bind(this),this.reject.bind(this))
 }
 resolve(value){
  if(this.state !== 'pending') return;
  this.state = 'fulfilled';
  this.value = value
 }
 reject(reason){
  if(this.state !== 'pending') return;
  this.state = 'rejected';
  this.value = reason
 }
 then(fulfilled,rejected){
  if (typeof fulfilled !== 'function' && typeof rejected !== 'function' ) {
   return this;
  }
  if (typeof fulfilled !== 'function' && this.state === 'fulfilled' ||
   typeof rejected !== 'function' && this.state === 'rejected') {
   return this;
  }
  return new MyPromise((resolve,reject)=>{
   if(fulfilled && typeof fulfilled === 'function' && this.state === 'fulfilled'){
    let result = fulfilled(this.value);
    if(result && typeof result.then === 'function'){
     return result.then(resolve,reject)
    }else{
     resolve(result)
    }
   }
   if(rejected && typeof rejected === 'function' && this.state === 'rejected'){
    let result = rejected(this.value);
    if(result && typeof result.then === 'function'){
     return result.then(resolve,reject)
    }else{
     resolve(result)
    }
   }
  })
 }
 catch(rejected){
  return this.then(null,rejected)
 }
}

測試

new MyPromise((resolve,reject)=>{
 console.log(1);
 //reject(2)
 resolve(2)
 console.log(3)
 setTimeout(()=>{console.log(4)},0)
}).then(res=>{
 console.log(res)
 return new MyPromise((resolve,reject)=>{
 resolve(5)
 }).then(res=>{
 return res
 })
}).then(res=>{
 console.log(res)
}).catch(e=>{
 console.log('e',e)
})

執(zhí)行結(jié)果:

> 1
> 3
> 2
> 5
> 4

原生promise

new Promise((resolve,reject)=>{
 console.log(1);
 //reject(2)
 resolve(2)
 console.log(3)
 setTimeout(()=>{console.log(4)},0)
}).then(res=>{
 console.log(res)
 return new Promise((resolve,reject)=>{
 resolve(5)
 }).then(res=>{
 return res
 })
}).then(res=>{
 console.log(res)
}).catch(e=>{
 console.log('e',e)
})

執(zhí)行結(jié)果:

> 1
> 3
> 2
> 5
> 4

以上是“JavaScript基礎教程之怎么實現(xiàn)一個簡單的promise”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)頁題目:JavaScript基礎教程之怎么實現(xiàn)一個簡單的promise-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://jinyejixie.com/article20/digeco.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航網(wǎng)站制作、外貿(mào)建站微信小程序、定制開發(fā)、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
阳城县| 澄江县| 淳安县| 伊宁市| 油尖旺区| 武鸣县| 桐乡市| 名山县| 成都市| 固始县| 偏关县| 娱乐| 澎湖县| 平乐县| 乌拉特后旗| 望江县| 肃南| 徐闻县| 四子王旗| 南涧| 新野县| 隆德县| 襄汾县| 松江区| 建宁县| 平度市| 平原县| 汶上县| 高密市| 杭州市| 根河市| 宜兰市| 浪卡子县| 新营市| 全州县| 招远市| 新巴尔虎左旗| 宣汉县| 钦州市| 嘉荫县| 乌恰县|