摘要:通過(guò)可以做到按需獲取。切出的過(guò)程類(lèi)似將一個(gè)值帶出協(xié)程同時(shí)主線(xiàn)程可以在一系列或者操作之后通過(guò)的方法與其通信恢復(fù)協(xié)程執(zhí)行。對(duì)象上部署接口使其具有可遍歷性
生成器的主要功能:通過(guò)一段程序,持續(xù)迭代或枚舉出符合某個(gè)公式或者算法的有序數(shù)列中的元素.
在js中的具體表現(xiàn)形式就是function*。通過(guò)generator可以做到按需獲取。
怎么理解,比如我們想獲取一定數(shù)量的fibonacci,可以通過(guò)下面這種方式;
function * fibo() { let a=0; let b=1; yield a; yield b; while (true){ let next = a+b; a=b; b=next; yield next; } } let generator=fibo(); for(let i=0;i<10;i++){ process.stdout.write(generator.next().value+" "); } console.log(".") //0 1 1 2 3 5 8 13 21 34 .
上面比較特殊的一點(diǎn)就是yield,作用與return類(lèi)似,但并非退出函數(shù)體,而是切出函數(shù)運(yùn)行時(shí)。
切出的過(guò)程類(lèi)似將一個(gè)值帶出協(xié)程(coroutine);同時(shí)主線(xiàn)程可以在一系列sync或者async操作之后,通過(guò)generator的next方法與其通信,恢復(fù)協(xié)程執(zhí)行。
generator.next(value) 獲取下一次生成器切出狀態(tài)(第一次執(zhí)行時(shí)為第一個(gè)切出狀態(tài))
generator.throw(error) 向當(dāng)前生成器返回執(zhí)行對(duì)象拋出錯(cuò)誤,終止生成器運(yùn)行,除非被異常被捕獲
generator[Symbol.iterator] 為生成器提供實(shí)現(xiàn)可迭代的方法(通過(guò)for-of語(yǔ)句可用)
generator.return 返回給定的值,終結(jié)遍歷Generator函數(shù)
其中用的最多用的是第一個(gè)方法。
生成器主要應(yīng)用場(chǎng)景(現(xiàn)階段我感覺(jué)只有下面兩個(gè)用處)同步化的方式表達(dá)異步操作,解決金字塔回調(diào)問(wèn)題。
before like this
//normal version function echo(content,cb) { cb(null,content); } function run() { echo("hello", (...rest0) => { console.log(rest0[1]+" world"); }); } run(); //hello world
generator equivalent writing
//thunk version function echo(content) { return cb => { cb(null,content); //generator作為logic主體,主線(xiàn)程執(zhí)行異步方法 } } function run(genFn) { const gen=genFn(); const next= value =>{ const ret=gen.next(value); if(ret.done)return; ret.value((err,val) => { //async tasks if(err) return console.error(err); next(val); //recursion }); } next(); } run(function* () { const msg0= yield echo("hello"); const msg1= yield echo(`${msg0} world`); console.log(msg1); //hello world });
說(shuō)明 我上面這種寫(xiě)法雖然簡(jiǎn)單,但是很多變種庫(kù)都有其影子,例如co,koa1 and so on。
對(duì)象上部署Iterator接口,使其具有可遍歷性
function* setIterator(obj) { let keys = Object.keys(obj); for (let i=0,len=keys.length; i < len; i++) { let key = keys[i]; yield [key, obj[key]]; } } let obj = { name: "gcy", age: "infinity" }; for (let [key, value] of setIterator(obj)) { console.log(key, value); } // name gcy // age infinity
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86926.html
摘要:函數(shù)最簡(jiǎn)單,不需要借助其他的執(zhí)行器即可按照順序執(zhí)行。函數(shù)執(zhí)行過(guò)程中遇到就會(huì)交出執(zhí)行權(quán)限,等到異步操作完成再進(jìn)行下面的操作,語(yǔ)句返回的是方法的參數(shù)。小程序不支持函數(shù),并且同時(shí)間最多支持個(gè)請(qǐng)求,所以被迫無(wú)奈,只能使用來(lái)做異步批量調(diào)用。 在日常開(kāi)發(fā)的過(guò)程中總會(huì)遇到一些下一個(gè)請(qǐng)求需要上一個(gè)請(qǐng)求的響應(yīng)數(shù)據(jù)作為參數(shù)(或者坑爹的小程序開(kāi)發(fā)只能同時(shí)最多請(qǐng)求5個(gè)),那么這個(gè)時(shí)候我們就需要批量地請(qǐng)求一批后...
摘要:本文是淺析微信支付系列文章的第十一篇,主要講解支付驗(yàn)收示例和驗(yàn)收指引。為保證商戶(hù)接入質(zhì)量,提升交易安全及用戶(hù)體驗(yàn),微信支付的合作服務(wù)商在正式上線(xiàn)交易前,必須先根據(jù)本文指引完成驗(yàn)收。 本文是【淺析微信支付】系列文章的第十一篇,主要講解支付驗(yàn)收示例和驗(yàn)收指引。 淺析微信支付系列已經(jīng)更新十一篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下。 淺析微信支付:如何使用沙箱環(huán)境測(cè)試 淺析微信支付:下載對(duì)賬單...
摘要:本文是淺析微信支付系列文章的第十篇,主要講解如何使用沙箱環(huán)境來(lái)測(cè)試微信支付。圖為微信支付仿真測(cè)試系統(tǒng)后簡(jiǎn)稱(chēng)仿真系統(tǒng)的簡(jiǎn)化原理圖。沙箱說(shuō)明微信支付沙箱環(huán)境,是提供給微信支付商戶(hù)的開(kāi)發(fā)者,用于模擬支付及回調(diào)通知。 本文是【淺析微信支付】系列文章的第十篇,主要講解如何使用沙箱環(huán)境來(lái)測(cè)試微信支付。 淺析微信支付系列已經(jīng)更新十篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下。 淺析微信支付:下載對(duì)賬單和資...
摘要:本文是淺析微信支付系列文章的第七篇,主要講解微信商戶(hù)平臺(tái)的訂單查詢(xún)和關(guān)閉接口的使用。查詢(xún)訂單以下為微信官方的查詢(xún)訂單文檔應(yīng)用場(chǎng)景該接口提供所有微信支付訂單的查詢(xún),商戶(hù)可以通過(guò)查詢(xún)訂單接口主動(dòng)查詢(xún)訂單狀態(tài),完成下一步的業(yè)務(wù)邏輯。 本文是【淺析微信支付】系列文章的第七篇,主要講解微信商戶(hù)平臺(tái)的訂單查詢(xún)和關(guān)閉接口的使用。 淺析微信支付系列已經(jīng)更新六篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下哦。 ...
摘要:淺析微信支付微信公眾號(hào)網(wǎng)頁(yè)授權(quán)本文是淺析微信支付系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁(yè)授權(quán)及用戶(hù)信息獲取。淺析微信支付系列已經(jīng)更新三篇了喲,沒(méi)有看過(guò)的朋友們可以看一下哦。 淺析微信支付:微信公眾號(hào)網(wǎng)頁(yè)授權(quán) 本文是【淺析微信支付】系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁(yè)授權(quán)及用戶(hù)信息獲取。 淺析微信支付系列已經(jīng)更新三篇了喲~,沒(méi)有看過(guò)的朋友們可以看一下哦。 淺...
閱讀 3559·2021-11-18 10:07
閱讀 1653·2021-11-04 16:08
閱讀 1605·2021-11-02 14:43
閱讀 1160·2021-10-09 09:59
閱讀 939·2021-09-08 10:43
閱讀 1203·2021-09-07 09:59
閱讀 1050·2019-12-27 11:56
閱讀 1169·2019-08-30 15:56