前言
我們在開發過程中大多會用到promise,想必大家對promise的使用都很熟練了,今天我們就來實現一個簡單的promise,實現的效果如有出入還往指正。
Promise/A+規范:
術語:
整體結構
我們先來梳理一下整體的結果,以便后續好操作
class MyPromise { constructor(fn){  } resolve(){ } then(){ } reject(){ } catch(){ }}Promise理論知識
摘抄至 http://es6.ruanyifeng.com/#docs/promise#Promise-all
Promise對象有以下兩個特點。
(1)對象的狀態不受外界影響。Promise對象代表一個異步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:從pending變為fulfilled和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
總結一下就是promise有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗),還有就是狀態的改變只能是pending -> fulfilled 或者 pending -> 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)) } ...}構造函數接收一個參數fn,且這個參數必須是一個函數,因為我們一般這樣使用new Promise((resolve,reject)=>{});
然后初始化一下promise的狀態,默認開始為pending,初始化value的值。            
新聞熱點
疑難解答
圖片精選