摘要:使用同步化異步函數(shù)的幾個步驟將異步代碼的每一步都封裝成一個普通的函數(shù)定義一個生成器函數(shù)把流程寫進去定義一個變量賦值為遍歷器對象生成器變量名
基本概念
Generator 是ES6的一種異步編程結(jié)局方案。
狀態(tài)機 (封裝了多個內(nèi)部狀態(tài) ) 遍歷器對象生成
function* helloWorldGenderator() { yield "hello"; yield "world"; return "ending"; } var hw=helloWorldGenderator();
有兩個狀態(tài) hw是指向一個內(nèi)部狀態(tài)對的指針對象
function* helloWorldGenderator() { yield "hello"; yield "world"; return "ending"; } var hw=helloWorldGenderator(); console.log(hw.next()) //{done:false value:"hello"} console.log(hw.next()) //{done:false value:"hello"} console.log(hw.next()) //{done:true value:"hello"}
生成的遍歷器之間彼此不受影響
function* g() { var o=1; yield o++; yield o++; yield o++; } var gen=g(); console.log(gen.next()) //1 var xx=g(); console.log(xx.next()) //1 console.log(gen.next()) //2 console.log(xx.next()) //2
當(dāng)調(diào)用next() 方法的時候 從上一個yield開始執(zhí)行 遇到y(tǒng)ield就會暫停執(zhí)行 并返回yield后邊的值
使用 for of方法自動可以遍歷 遍歷器對象function* g() { yield 1; yield 2; yield 3; yield 4; yield 5; return 6; } let a=g(); for(let i of a){ console.log(i) //1 2 3 4 5 }
實現(xiàn)菲薄齊納函數(shù)
function* ff() { let [prev,curr]=[0,1]; for(;;){ [prev,curr]=[curr,prev+curr]; console.log("---------") yield curr; } } for(let n of ff()){ if(n>100) break console.log(n) }狀態(tài)機
ES5版本的狀態(tài)機
var ticking=true; var clock=function () { if(ticking){ console.log("Tick"); }else{ console.log("Tock"); } ticking=!ticking } setInterval(clock,1000)
ES6版本的狀態(tài)機
function* Clock () { while (true){ console.log("111") yield ; console.log("222") yield ; } } var cc=Clock(); setInterval(function () { cc.next() },1000)使用Generator函數(shù)實現(xiàn)異步操作
使用例子:在服務(wù)器端有3個文件 a.html b.html c.html 現(xiàn)在前端需要讀到這三個文件的內(nèi)容才可以繼續(xù)執(zhí)行操作。
$.get("a.json",function (data) { console.log(data) $.get("b.json",function (data) { console .log(data) $.get("c.json",function (data) { console.log(data) //執(zhí)行前端代碼 }) }) })
異步回調(diào)函數(shù)的地域
function request(url) { $.get(url,function (response) { it.next(response); }) } function* ajaxs () { var i=0; console.log(++i,yield request("a.json")) console.log(++i,yield request("b.json")) console.log(++i,yield request("c.json")) } var it=ajaxs(); it.next();
使用Generator實現(xiàn)了異步請求三個文件 。
使用Generator同步化異步函數(shù)的幾個步驟
1、將異步代碼的每一步都封裝成一個普通的函數(shù)
2、定義一個生成器函數(shù) 把流程寫進去
3、定義一個變量 賦值為遍歷器對象生成器
4、變量名.next()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85189.html
摘要:調(diào)用函數(shù)后和普通函數(shù)不同的是,該函數(shù)并不立即執(zhí)行,也不返回函數(shù)執(zhí)行結(jié)果,而是返回一個指向內(nèi)部狀態(tài)的對象,也可以看作是一個遍歷器對象。第一個只是用來啟動函數(shù)內(nèi)部的遍歷器,傳參也沒有多大意義。 之前斷斷續(xù)續(xù)接觸到了一些ES6的知識,異步編程方面聽得比較多的就是Promise,直到最近比較系統(tǒng)地學(xué)習(xí)了ES6的新特性才發(fā)現(xiàn)Generator這個神奇的存在,它可以實現(xiàn)一些前所未有的事情,讓我頓時...
摘要:返回的遍歷器對象可以依次遍歷函數(shù)內(nèi)部的每一個狀態(tài)。示例內(nèi)部捕獲外部捕獲內(nèi)部捕獲外部捕獲上面代碼遍歷器對象連續(xù)拋出兩個錯誤,第一個被函數(shù)體內(nèi)的捕獲。上面代碼中,首先執(zhí)行函數(shù),獲取遍歷器對象,然后使用方法第二行,執(zhí)行異步任務(wù)的第一階段。 參考 來源《ecmascript6 入門》generator部分 認識generator函數(shù) 形式上,generator函數(shù)有兩個特點:一是functio...
摘要:函數(shù)返回的遍歷器對象,還有一個方法,可以返回給定的值,并且終結(jié)遍歷函數(shù)。這被稱為表達式個人理解主要用作遍歷具有遍歷器接口的對象或函數(shù)。完整形式函數(shù)的函數(shù)總是返回一個遍歷器,規(guī)定這個遍歷器是函數(shù)的實例,也繼承了函數(shù)的對象上的方法。 語法上 首先可以把它理解成,Generator 函數(shù)是一個狀態(tài)機,封裝了多個內(nèi)部狀態(tài)。執(zhí)行 Generator 函數(shù)會返回一個遍歷器對象,也就是說,Gener...
摘要:同時,迭代器有一個方法來向函數(shù)中暫停處拋出一個錯誤,該錯誤依然可以通過函數(shù)內(nèi)部的模塊進行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個人能力有限,翻譯中難免有紕漏和錯誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...
摘要:返回的遍歷器對象,可以依次遍歷函數(shù)內(nèi)部的每一個狀態(tài)。方法調(diào)用遍歷器對象的方法,使得指針移向下一個狀態(tài)。運行結(jié)果就是使用一個遍歷器,遍歷了多個函數(shù),有遞歸的效果。 1、Generator簡介 基本概念 Generator函數(shù)有多種理解角度。從語法上,首先可以把它理解成,Generator函數(shù)是一個狀態(tài)機,封裝了多個內(nèi)部狀態(tài)。 執(zhí)行Generator函數(shù)會返回一個遍歷器對象,也就是說,Ge...
摘要:換句話說,我們很好的對代碼的功能關(guān)注點進行了分離通過將使用消費值得地方函數(shù)中的邏輯和通過異步流程來獲取值迭代器的方法進行了有效的分離。但是現(xiàn)在我們通過來管理代碼的異步流程部分,我們解決了回調(diào)函數(shù)所帶來的反轉(zhuǎn)控制等問題。 本文翻譯自 Going Async With ES6 Generators 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,還望指正Issue ES6 Gener...
閱讀 2699·2021-11-25 09:43
閱讀 2500·2021-09-22 15:29
閱讀 1022·2021-09-22 15:17
閱讀 3682·2021-09-03 10:36
閱讀 2257·2019-08-30 13:54
閱讀 1781·2019-08-30 11:23
閱讀 1192·2019-08-29 16:58
閱讀 1320·2019-08-29 16:14