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