有一位同學在StackOverflow上提問,他想建立一個 Future
類,非同步的實現 Future
的構造,當構造完成之後自動呼叫 .then
方法,執行後面的邏輯
class Features {
features = null
constructor(){
fetchFeatures()
}
async fetchFeatures() {
this.features = await fetch('https://api.github.com/'))
}
}
const featuresInstance = new Features();
featuresInstance.then((res) => console.log(featuresInstance.features));
我第一眼想到的是繼承 Promise
但是繼承 Promise
是行不通的,具體請看 這裡
簡單來說就是 Promise 的執行需要執行時提供魔法,不能簡單的透過 super
建構函式傳參來執行,另外即便可以傳參,也無法使用this,起不到題主要求的封裝的效果
首先說明題主的需求是一個偽需求,非同步載入資源可以透過Promise來實現,沒必要封裝到建構函式里
下面給出題主要求的偽需求的實現方式
class Features {
features = null
#prom = null
constructor(){
return Object.assign(this,this.#prom = new Promise(this.fetchFeatures.bind(this)))
}
then(callback) {
return this.#prom.then(callback)
}
async fetchFeatures(resolve) {
resolve(this.features = await fetch('https://api.github.com/'))
}
}
const featuresInstance = new Features();
featuresInstance.then((res) => console.log(featuresInstance));
執行結果為
可以說是非常完美的實現了需求,但是為什麼說是一次失敗的嘗試呢?
因為題主把問題刪了!!???
可能是因為被人點了踩,或者是自己意識到這是反模式吧,總之我在解決這個問題的過程中獲得了成長(this指向,bind函式細節,super用法,複習非同步程式碼,混入mixin,私有欄位)
(注意mixin是向prototype中assign目標物件,我這裡並不是正規mixin)
今天就到這裡吧,撒由那拉~~