ES6非同步解決方案promise原理及簡單實現

2021-09-26 20:20:44 字數 1498 閱讀 5217

promise是es6規範中定義的一種非同步解決方案,它可以在非同步函式處理流程中分離執行**和處理結果,還能夠新增處理成功、失敗後的鉤子函式,下面是乙個簡單案例

new

promise

(funcion

(resolve, reject)

,2000)}

).then

(msg=>

)

上述**可以看到,首先是new乙個promise例項,物件會傳入乙個執行函式作為引數,該函式稱為z

z接受兩個固定引數,resolve與reject,在z的非同步邏輯處理完成後執行resolve(),然後執行then函式內部的邏輯,同時resolve函式可以傳入引數被then函式接收

在這裡,可能會產生如下疑問

promise例項傳入的邏輯函式,為什麼加resolve, reject兩個引數

resolve是如何觸發then函式的,then函式又是如何接受資料的

簡單思考一下,此處有點類似發布-訂閱模式,resolve()相當於乙個事件通知,物件接收到通知後,執行下一步操作,這裡便應該有乙個事件佇列,對此我們做乙個模擬實現

class

kpromise

_resolve

(val)

this

._finally

(this

.value);}

);//resolve函式載入微命令之中,避免宣告的promise函式內部無異步操作時出現未完成宣告提前執行的情況

window.

postmessage(''

);}_reject

(val)

this

._finally

(this

.value);}

);window.

postmessage(''

);}_finally()

}); window.

postmessage(''

);}then

( resolvedhandler, rejectedhandler )

else

}else

}function

newrejectedhandler

(val)

else

}else

}//事件函式匯入佇列

this

.resolvedqueues.

push

(newresolvedhandler)

;this

.rejectedqueues.

push

(newrejectedhandler);}

);}finally

(finallyhandler)

static

resolve

(val));

}static

reject

(val));

}}

ES6 中的 三種非同步解決方案

generator 函式 執行會返回乙個迭代器 iterator 在迭代器上可以呼叫 next 方法,執行下乙個 yield 或 return 呼叫 next 方法,會返回乙個物件,value 的值 為 yield 之後表示式的值,done 的值 表示迭代器,是否已經執行完畢 最後乙個yield 或...

解決使用es6非同步函式的錯誤

前段時間在寫react專案時,使用了es6的async非同步函式,結果報了一大堆錯誤,控制台也提示,缺少相應的模組,今天來給大家分享一下,如何解決這個錯誤。如果不安裝相應得外掛程式,就使用es6的非同步函式的話,就出出現以下提示 解決方法 1 安裝乙個 babel polyfill 然後在.babe...

js 非同步解決方案

js的非同步請求歷來被詬病,但是社群和規範一直也在努力,這裡簡單說下這些變化。嚴格地說ajax屬於與伺服器交換資料的api,與非同步並不完全相同。但對於早期的前端來說,非同步的操作基本都是與ajax交涉的過程。可以看出這個物件具有濃濃的物件導向的風格,沒有函式式編輯的優雅。目前作為xhr的替代api...