本篇內(nèi)容主要講解“什么是JS Generator 函數(shù)以及怎么用JS Generator 函數(shù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是JS Generator 函數(shù)以及怎么用JS Generator 函數(shù)”吧!
創(chuàng)新互聯(lián)公司是一家專業(yè)提供吉首企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、H5建站、小程序制作等業(yè)務(wù)。10年已為吉首眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。JS是JavaScript的簡(jiǎn)稱,它是一種直譯式的腳本語(yǔ)言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網(wǎng)站添加各種各樣的動(dòng)態(tài)效果,讓網(wǎng)頁(yè)更加美觀。
還是那句話,所有事物的出現(xiàn)都是為了解決對(duì)應(yīng)的問(wèn)題。
那么Generator出現(xiàn)是為了解決什么問(wèn)題的呢?
在異步編程的場(chǎng)景下,如果有多個(gè)異步任務(wù),如何處理他們的先后執(zhí)行順序?
舉一個(gè)常見(jiàn)的例子,jquery的ajax請(qǐng)求,每一個(gè)success都是一個(gè)異步任務(wù)。
那么問(wèn)題來(lái)了,如果我要保證頁(yè)面渲染要在5個(gè)網(wǎng)絡(luò)請(qǐng)求都回來(lái)之后再去渲染頁(yè)面。
我們的代碼就會(huì)變成:
$.ajax({...success:function(data){ $.ajax({...success:function(data){ $.ajax({...success:function(data){ $.ajax({...success:function(data){ $.ajax({...success:function(data){ //do something }}) }}) }}) }}) }})
這就是”回調(diào)函數(shù)噩夢(mèng)”(callback hell)
為了解決這個(gè)問(wèn)題,后來(lái)出現(xiàn)了Deferred和promise
兩者區(qū)別不大,通過(guò)一種包裝寫法來(lái)減少回調(diào)函數(shù)
上面的ajax就可以寫成:
ajax1 = $.ajax({...success:function(data){}); ajax2 = $.ajax({...success:function(data){}); ajax3 = $.ajax({...success:function(data){}); ajax4 = $.ajax({...success:function(data){}); ajax5 = $.ajax({...success:function(data){}); $.when(ajax1,ajax2,ajax3,ajax4,ajax5).done(function( //do something )).then(function(){ //do something2 })
1.8版本以上的jquery ajax模塊默認(rèn)返回Deferred對(duì)象
Deferred和promise將回調(diào)函數(shù)做拆分,將異步任務(wù)的處理和執(zhí)行分成兩部分完成
他們大的問(wèn)題就是代碼冗余,包裝之后的代碼都需要通過(guò)then,done來(lái)執(zhí)行后面的內(nèi)容,也導(dǎo)致層次感不清晰
那有沒(méi)有一種比較無(wú)感,簡(jiǎn)單的寫法呢?
那就是協(xié)程,
我之前也是在這個(gè)地方困惑了很久,
前面說(shuō)的大多日常用到過(guò),也清楚一些原理,
關(guān)于協(xié)程用到的就少了,我們來(lái)分析下吧。
直接看一下協(xié)程的例子:
function asnycJob() { // ...其他代碼 var f = yield readFile(fileA); // ...其他代碼 }
阮一峰老師的原話:
上面代碼的函數(shù) asyncJob 是一個(gè)協(xié)程,它的奧妙就在其中的 yield 命令。它表示執(zhí)行到此處,執(zhí)行權(quán)將交給其他協(xié)程。也就是說(shuō),yield命令是異步兩個(gè)階段的分界線。 協(xié)程遇到 yield 命令就暫停,等到執(zhí)行權(quán)返回,再?gòu)臅和5牡胤嚼^續(xù)往后執(zhí)行。它的大優(yōu)點(diǎn),就是代碼的寫法非常像同步操作,如果去除yield命令,簡(jiǎn)直一模一樣。
之前沒(méi)理解的原因就是沒(méi)好好讀這兩句話,今認(rèn)真看了一下,茅塞頓開。重要的有這么幾點(diǎn)
首先asnycJob這個(gè)方法就是一個(gè)協(xié)程
yield相當(dāng)于return,會(huì)返回當(dāng)前程序的執(zhí)行狀態(tài)
當(dāng)執(zhí)行到y(tǒng)ield,程序掛起等待返回后繼續(xù)執(zhí)行。
掛起這段時(shí)間去執(zhí)行其他協(xié)程函數(shù)
Generator函數(shù)是ES6對(duì)協(xié)程函數(shù)的實(shí)現(xiàn),
Generator函數(shù)的特點(diǎn)就是可以暫停代碼執(zhí)行。
跟協(xié)程函數(shù)一樣,遇到y(tǒng)ield關(guān)鍵字就暫停代碼執(zhí)行,
跟普通函數(shù)的區(qū)別在于Generator函數(shù)不會(huì)反悔結(jié)果,而是返回指針對(duì)象,
通過(guò)指針的next方法移動(dòng)指針指向下一個(gè)yield關(guān)鍵字位置。
也就是說(shuō)Generator函數(shù)的分階段執(zhí)行是由next方法控制的。
使用了Generator函數(shù)之后會(huì)對(duì)我們的代碼有多大的改變呢?
fangction* gen(){ var url = 'user/get/info'; var data = yield $.get({url:url}); console.log(data.userName); }
你不需要擔(dān)心遠(yuǎn)程接口的返回時(shí)機(jī),完全按照同步的方式寫代碼就行。
但是也有缺點(diǎn),Generator函數(shù)把一步操作做的很簡(jiǎn)潔,但對(duì)流程的管理卻不方便,
上面的例子如何執(zhí)行?
var g = gen(); g.next(); g.next();
next 方法的作用是分階段執(zhí)行 Generator 函數(shù)。每次調(diào)用 next 方法,會(huì)返回一個(gè)對(duì)象,
表示當(dāng)前階段的信息( value 屬性和 done 屬性)。value 屬性是 yield 語(yǔ)句后面表達(dá)式的值,表示當(dāng)前階段的值;
done 屬性是一個(gè)布爾值,表示 Generator 函數(shù)是否執(zhí)行完畢,即是否還有下一個(gè)階段。
你需要執(zhí)行兩次.next方法,來(lái)將你的Generator函數(shù)執(zhí)行完畢。
關(guān)于如何自動(dòng)化異步任務(wù)的流程管理,就需要co,thunk,async的幫助了
到此,相信大家對(duì)“什么是JS Generator 函數(shù)以及怎么用JS Generator 函數(shù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞標(biāo)題:什么是JSGenerator函數(shù)以及怎么用JSGenerator函數(shù)-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://www.rwnh.cn/article14/ccicde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、App設(shè)計(jì)、建站公司、Google、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容