异步编程Promise、Generator和Async
在JavaScript的世界里,對于異步編程存在如下幾種方案:
1.回調函數;
2.事件觸發監聽;
3.發布訂閱者模式;
4.Promise。
首先介紹Promise,然后介紹ES6提供的生成器函數,async函數。
1.Promise來源于社區,代表一個對象,它代表異步操作未來的一個結果(承諾)。它總共有三個狀態,pending \ fulfilled \ rejected。
另外,它的狀態翻轉路徑只有兩個:pending -> fulfilled or pending -> rejected,一旦狀態翻轉,就不可變了。它支持鏈式調用,支持錯誤傳遞,支持以同步代碼的方式寫異步操作。
Promise是一個對象,創建此對象實例的方法如下(可以理解resolve和reject是已返回的承諾對象未來回調函數的占位)
2.Generator函數是ES6提供的異步編程解決方案。對于Generator函數,可以將它理解為一個狀態機,封裝了多個內部狀態;此外它還是一個遍歷器生成函數,這個函數可以遍歷出狀態機的所有狀態。
函數特征:關鍵字function與函數名之間有*,函數體內部yeild關鍵字。
生成器函數與普通函數的區別:函數調用后不執行,而是返回一個指針對象(遍歷器對象)。調用對象的next()方法,執行一段yield邏輯。故函數的分段執行的,yield是暫停執行的標志,next()可以恢復執行。
yield與return的區別:yield有記憶功能,return沒有;一個函數可以多次執行yeild,但只會return一次
3.async函數是Generator函數的語法糖,它進行了改進:
(1) 自帶執行器;
(2) 返回值是Promise;
三家對比:使用Promise的異步代碼存在大量自有API的調用,操作本身的語義夾雜其中,不是很清晰;Generator函數實現的異步代碼語義比Promise清晰,但需要一個執行器;async函數的寫法最簡潔、符合語義,不需要執行器。
總結
以上是生活随笔為你收集整理的异步编程Promise、Generator和Async的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三字独特好听游戏名字,稀少好听的三字ID
- 下一篇: echarts实现给图例添加单位、百分比