亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

如何從零開始利用js手寫一個Promise庫詳解

2024-05-06 16:43:47
字體:
來源:轉載
供稿:網友

前言

ECMAScript 是 JavaScript 語言的國際標準,JavaScript 是 ECMAScript 的實現。ES6 的目標,是使得 JavaScript 語言可以用來編寫大型的復雜的應用程序,成為企業級開發語言。

概念

ES6 原生提供了 Promise 對象。

所謂 Promise,就是一個對象,用來傳遞異步操作的消息。它代表了某個未來才會知道結果的事件(通常是一個異步操作),并且這個事件提供統一的 API,可供進一步處理。

三道思考題

剛開始寫前端的時候,處理異步請求經常用callback,簡單又順手。后來寫著寫著就拋棄了callback,開始用promise來處理異步問題。promise寫起來確實更加優美,但由于缺乏對它內部結構的深刻認識,每次在遇到一些復雜的情況時,promise用起來總是不那么得心應手,debug也得搞半天。

所以,這篇文章我會帶大家從零開始,手寫一個基本能用的promise。跟著我寫下來以后,你會對promise是什么以及它的內部結構有一個清楚的認知,未來在復雜場景下使用promise也能如魚得水。

而且,為了檢驗大家是否真的完全掌握了promise,我會在文章結尾出幾道跟promise相關的練習題。說是練習題,其實都是大家項目中會遇到的真實場景的抽象,熟練掌握可以幫助大家在前端方面更上一層樓。

提前將三道練習題給出來,大家可以先不看下文的內容,在腦海里大概構思下你會怎么解決:

  • promise array的鏈式調用?
  • promise怎么做并發控制?
  • promise怎么做異步緩存?

以上三道思考題其實跟你用不用promise并沒有多大關系,但是如果你不深刻理解promise想要解決這三個問題還真不是那么輕松的。

什么是Promise

回到正文,什么是Promise?說白了,promise就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。

首先,ES6規定Promise對象是一個構造函數,用來生成Promise實例。然后,這個構造函數接受一個函數(executor)作為參數,該函數的兩個參數分別是resolve和reject。最后,Promise實例生成以后,可以用then方法分別指定resolved狀態和rejected狀態的回調函數(onFulfilled和onRejected)。

具體的使用方法,用代碼表現是這樣:

jsp/5951.html">js;">const promise = new Promise(function(resolve, reject) { // ... some code if (/* 異步操作成功 */){ resolve(value); } else { reject(error); }});promise.then(function(value) { // success}, function(error) { // failure});

理解了這個后,我們就可以大膽的開始構造我們自己的promise了,我們給它取個名字:CutePromise

實現一個Promise:CutePromise

我們直接用ES6的class來創建我們的CutePromise,對ES6語法還不熟悉的,可以先讀一下我的另外兩篇介紹ES6核心語法的文章后再回來。30分鐘掌握ES6/ES2015核心內容(上) 、30分鐘掌握ES6/ES2015核心內容(下)

class CutePromise { // executor是我們實例化CutePromise時傳入的參數函數,它接受兩個參數,分別是resolve和reject。 // resolve和reject我們將會定義在constructor當中,供executor在執行的時候調用 constructor(executor) { const resolve = () => {} const reject = () => {} executor(resolve, reject) } // 為實例提供一個then的方法,接收兩個參數函數, // 第一個參數函數必傳,它會在promise已成功(fulfilled)以后被調用 // 第二個參數非必傳,它會在promise已失敗(rejected)以后被調用 then(onFulfilled, onRejected) {}}

創建了我們的CutePromise后,我們再來搞清楚一個關鍵點:Promise 對象的狀態。

Promise 對象通過自身的狀態,來控制異步操作。一個Promise 實例具有三種狀態:

  • 異步操作未完成(pending)
  • 異步操作成功(fulfilled)
  • 異步操作失?。╮ejected)

上面三種狀態里面,fulfilled和rejected合在一起稱為resolved(已定型)。狀態的切換只有兩條路徑:第一種是從pending=>fulfilled,另一種是從pending=>rejected,狀態一旦切換就不能再改變。

現在我們來為CutePromise添加狀態,大概流程就是:

首先,實例化初始過程中,我們先將狀態設為PENDING,然后當executor執行resolve的時候,將狀態更改為FULFILLED,當executor執行reject的時候將狀態更改為REJECTED。同時更新實例的value。

constructor(executor) { ... this.state = 'PENDING'; ... const resolve = (result) => {  this.state = 'FULFILLED';  this.value = result; } const reject = (error) => {  this.state = 'REJECTED';  this.value = error; } ...}

再來看下我們的then函數。then函數的兩個參數,onFulfilled表示當promise異步操作成功時調用的函數,onRejected表示當promise異步操作失敗時調用的函數。假如我們調用then的時候,promise已經執行完成了(當任務是個同步任務時),我們可以直接根據實例的狀態來執行相應的函數。假如promise的狀態還是PENDING, 那我們就將onFulfilled和onRejected直接存儲到chained這個變量當中,等promise執行完再調用。

constructor(executor) { ... this.state = 'PENDING';  // chained用來儲存promise執行完成以后,需要被依次調用的一系列函數 this.chained = []; const resolve = (result) => {  this.state = 'FULFILLED';  this.value = result;    // promise已經執行成功了,可以依次調用.then()函數里的onFulfilled函數了  for (const { onFulfilled } of this.chained) {   onFulfilled(res);  } } ...}then(onFulfilled, onRejected) { if (this.state === 'FULFILLED') { onFulfilled(this.value); } else if (this.state === 'REJECTED') { onRejected(this.value); } else { this.$chained.push({ onFulfilled, onRejected }); }}

這樣我們就完成了一個CutePromise的創建,下面是完整代碼,大家可以復制代碼到控制臺測試一下:

class CutePromise { constructor(executor) { if (typeof executor !== 'function') {  throw new Error('Executor must be a function'); } this.state = 'PENDING'; this.chained = []; const resolve = res => {  if (this.state !== 'PENDING') {  return;  }  this.state = 'FULFILLED';  this.internalValue = res;  for (const { onFulfilled } of this.chained) {  onFulfilled(res);  } }; const reject = err => {  if (this.state !== 'PENDING') {  return;  }  this.state = 'REJECTED';  this.internalValue = err;  for (const { onRejected } of this.chained) {  onRejected(err);  } }; try {  executor(resolve, reject); } catch (err) {  reject(err); } }  then(onFulfilled, onRejected) { if (this.state === 'FULFILLED') {  onFulfilled(this.internalValue); } else if (this.$state === 'REJECTED') {  onRejected(this.internalValue); } else {  this.chained.push({ onFulfilled, onRejected }); } }}

提供一下測試代碼:

let p = new CutePromise(resolve => { setTimeout(() => resolve('Hello'), 100);});p.then(res => console.log(res));p = new CutePromise((resolve, reject) => { setTimeout(() => reject(new Error('woops')), 100);});p.then(() => {}, err => console.log('Async error:', err.stack));p = new CutePromise(() => { throw new Error('woops'); });p.then(() => {}, err => console.log('Sync error:', err.stack));

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.99久久热国产日韩欧美.com| 98精品国产高清在线xxxx天堂| 国产精品美乳在线观看| 日本最新高清不卡中文字幕| 欧美激情精品久久久久久黑人| 欧美男插女视频| 欧美一级片在线播放| 欧美大片大片在线播放| 92国产精品视频| 亚洲欧美成人网| 成人午夜在线观看| 亚洲va国产va天堂va久久| 精品国产欧美一区二区五十路| 精品亚洲国产视频| 国产亚洲精品高潮| 爽爽爽爽爽爽爽成人免费观看| 亚洲色图日韩av| 韩国国内大量揄拍精品视频| 国产精品人成电影在线观看| 国产精品丝袜视频| 欧美日韩一区二区免费在线观看| 精品国内自产拍在线观看| 成人黄色免费网站在线观看| 亚洲伊人一本大道中文字幕| 91精品一区二区| 最近2019年日本中文免费字幕| 欧美老少做受xxxx高潮| 欧美激情视频在线观看| 欧美国产中文字幕| 日韩毛片在线看| 亚洲网站视频福利| 九九精品在线观看| 成人av电影天堂| 国产亚洲日本欧美韩国| 亚洲一区二区自拍| 欧美午夜片欧美片在线观看| 亚洲人线精品午夜| 精品二区三区线观看| 九九精品视频在线观看| 97视频在线播放| 日韩中文字幕免费视频| 97成人超碰免| 欧美自拍视频在线| 91精品国产综合久久香蕉922| 久久久精品国产| 亚洲成年人影院在线| 日韩成人激情在线| www欧美xxxx| 久久精品99国产精品酒店日本| 国产精品第七十二页| 这里只有视频精品| 亚洲欧美中文字幕在线一区| 国产精品久久电影观看| 欧美激情中文字幕在线| 亚洲香蕉伊综合在人在线视看| 国产精品成人v| 欧美黑人巨大xxx极品| 久久中文精品视频| 中文字幕亚洲激情| 成人免费网视频| 亚洲男人的天堂在线播放| 日韩中文字幕免费看| 久久久免费高清电视剧观看| 日本精品久久久久影院| 国产成人精品免费视频| 国产精品激情av在线播放| 91老司机在线| 亚洲国产精品999| 日韩成人中文字幕在线观看| 成人免费高清完整版在线观看| 欧美日韩美女视频| 69**夜色精品国产69乱| 久久97精品久久久久久久不卡| 成人羞羞国产免费| 国产欧美日韩最新| 亚洲精品动漫久久久久| 国产国语videosex另类| 日韩视频中文字幕| 国产精品美女999| 日韩大片免费观看视频播放| 日韩精品极品毛片系列视频| 亚洲综合大片69999| 欧美中文在线免费| 日韩免费高清在线观看| 91久久久国产精品| 久久久久久久一区二区三区| 国产精品美女免费| 欧美午夜视频在线观看| 青青在线视频一区二区三区| 国产成人精品免费视频| 精品国产一区二区三区久久狼黑人| 久久久久久国产精品| 国产精品免费一区| 国产在线98福利播放视频| 亚洲第一天堂无码专区| 一本一本久久a久久精品牛牛影视| 国产成人久久久精品一区| 成人一区二区电影| 91sao在线观看国产| 久久色精品视频| 久久久女人电视剧免费播放下载| 国产主播在线一区| 97香蕉超级碰碰久久免费软件| 精品久久久久久久中文字幕| 九色91av视频| 78m国产成人精品视频| 97超视频免费观看| 亚洲国产福利在线| 亚洲视频一区二区| 久久久久久久久久国产精品| 久久精品中文字幕免费mv| 久久人人爽人人爽人人片av高请| 欧美一区二区影院| 欧美一级大片视频| 久久国产精品首页| 国产视频精品久久久| 国产日韩欧美日韩大片| 91精品国产高清久久久久久| 中文欧美在线视频| 欧美日韩在线免费观看| 欧美大片在线看免费观看| 亚洲欧美国产精品va在线观看| 欧美激情在线观看视频| 国产亚洲福利一区| 欧美在线免费观看| 精品亚洲精品福利线在观看| 国产91亚洲精品| 中文字幕亚洲情99在线| 在线日韩日本国产亚洲| 欧美激情视频网| 羞羞色国产精品| 国产在线观看不卡| 国产亚洲综合久久| 亚洲成色777777在线观看影院| 欧美精品一区二区三区国产精品| 日韩精品中文字幕在线| 国产精品久久久av| 久久精品小视频| 一区二区三区视频免费在线观看| 国产精品久久久久9999| 亚洲综合成人婷婷小说| 久久伊人精品天天| 精品国产一区二区三区在线观看| 2021国产精品视频| 国产精品色午夜在线观看| 尤物99国产成人精品视频| 国产精品一区二区三区免费视频| 久色乳综合思思在线视频| 97香蕉久久夜色精品国产| 久久久噜久噜久久综合| 亚洲国产精品va在线| 久久亚洲国产成人| 欧美日韩一区二区三区| 97成人精品区在线播放| 欧美精品18videos性欧| 国产精品青草久久久久福利99| 成人做爰www免费看视频网站| 丝袜美腿精品国产二区| 亚洲欧美一区二区精品久久久| 韩曰欧美视频免费观看| …久久精品99久久香蕉国产| 久久琪琪电影院| 欧美性猛交xxxx富婆| 日韩av片永久免费网站|