电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS Generator 函數(shù)的含義與用法實(shí)例總結(jié)

瀏覽:118日期:2024-05-13 16:18:23

本文實(shí)例講述了JS Generator 函數(shù)的含義與用法。分享給大家供大家參考,具體如下:

讀阮一峰老師《Generator 函數(shù)的含義與用法》總結(jié)

老師的文章通俗易懂,但是我個(gè)人理解上面有一些差,所以看了幾遍之后才有呢么一點(diǎn)點(diǎn)體會(huì)

把它記錄下來(lái)。

還是那句話,所有事物的出現(xiàn)都是為了解決對(duì)應(yīng)的問(wèn)題。

那么Generator出現(xiàn)是為了解決什么問(wèn)題的呢?

在異步編程的場(chǎng)景下,如果有多個(gè)異步任務(wù),如何處理他們的先后執(zhí)行順序?

舉一個(gè)常見的例子,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)致層次感不清晰

那有沒有一種比較無(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)直一模一樣。

之前沒理解的原因就是沒好好讀這兩句話,今認(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的幫助了

原文:Generator 函數(shù)的含義與用法

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 冷却塔厂家_冷却塔维修_冷却塔改造_凉水塔配件填料公司- 广东康明节能空调有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 物流公司电话|附近物流公司电话上门取货| wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 国资灵活用工平台_全国灵活用工平台前十名-灵活用工结算小帮手 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 周口市风机厂,周鼓风机,河南省周口市风机厂| 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司| 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | Pos机办理_个人商户免费POS机申请-拉卡拉办理网 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 |