摘要:通過可以做到按需獲取。切出的過程類似將一個值帶出協(xié)程同時主線程可以在一系列或者操作之后通過的方法與其通信恢復(fù)協(xié)程執(zhí)行。對象上部署接口使其具有可遍歷性
生成器的主要功能:通過一段程序,持續(xù)迭代或枚舉出符合某個公式或者算法的有序數(shù)列中的元素.
在js中的具體表現(xiàn)形式就是function*。通過generator可以做到按需獲取。
怎么理解,比如我們想獲取一定數(shù)量的fibonacci,可以通過下面這種方式;
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 .
上面比較特殊的一點就是yield,作用與return類似,但并非退出函數(shù)體,而是切出函數(shù)運(yùn)行時。
切出的過程類似將一個值帶出協(xié)程(coroutine);同時主線程可以在一系列sync或者async操作之后,通過generator的next方法與其通信,恢復(fù)協(xié)程執(zhí)行。
generator.next(value) 獲取下一次生成器切出狀態(tài)(第一次執(zhí)行時為第一個切出狀態(tài))
generator.throw(error) 向當(dāng)前生成器返回執(zhí)行對象拋出錯誤,終止生成器運(yùn)行,除非被異常被捕獲
generator[Symbol.iterator] 為生成器提供實現(xiàn)可迭代的方法(通過for-of語句可用)
generator.return 返回給定的值,終結(jié)遍歷Generator函數(shù)
其中用的最多用的是第一個方法。
生成器主要應(yīng)用場景(現(xiàn)階段我感覺只有下面兩個用處)同步化的方式表達(dá)異步操作,解決金字塔回調(diào)問題。
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主體,主線程執(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 });
說明 我上面這種寫法雖然簡單,但是很多變種庫都有其影子,例如co,koa1 and so on。
對象上部署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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86926.html
摘要:函數(shù)最簡單,不需要借助其他的執(zhí)行器即可按照順序執(zhí)行。函數(shù)執(zhí)行過程中遇到就會交出執(zhí)行權(quán)限,等到異步操作完成再進(jìn)行下面的操作,語句返回的是方法的參數(shù)。小程序不支持函數(shù),并且同時間最多支持個請求,所以被迫無奈,只能使用來做異步批量調(diào)用。 在日常開發(fā)的過程中總會遇到一些下一個請求需要上一個請求的響應(yīng)數(shù)據(jù)作為參數(shù)(或者坑爹的小程序開發(fā)只能同時最多請求5個),那么這個時候我們就需要批量地請求一批后...
摘要:本文是淺析微信支付系列文章的第十一篇,主要講解支付驗收示例和驗收指引。為保證商戶接入質(zhì)量,提升交易安全及用戶體驗,微信支付的合作服務(wù)商在正式上線交易前,必須先根據(jù)本文指引完成驗收。 本文是【淺析微信支付】系列文章的第十一篇,主要講解支付驗收示例和驗收指引。 淺析微信支付系列已經(jīng)更新十一篇了喲~,沒有看過的朋友們可以看一下。 淺析微信支付:如何使用沙箱環(huán)境測試 淺析微信支付:下載對賬單...
摘要:本文是淺析微信支付系列文章的第十篇,主要講解如何使用沙箱環(huán)境來測試微信支付。圖為微信支付仿真測試系統(tǒng)后簡稱仿真系統(tǒng)的簡化原理圖。沙箱說明微信支付沙箱環(huán)境,是提供給微信支付商戶的開發(fā)者,用于模擬支付及回調(diào)通知。 本文是【淺析微信支付】系列文章的第十篇,主要講解如何使用沙箱環(huán)境來測試微信支付。 淺析微信支付系列已經(jīng)更新十篇了喲~,沒有看過的朋友們可以看一下。 淺析微信支付:下載對賬單和資...
摘要:本文是淺析微信支付系列文章的第七篇,主要講解微信商戶平臺的訂單查詢和關(guān)閉接口的使用。查詢訂單以下為微信官方的查詢訂單文檔應(yīng)用場景該接口提供所有微信支付訂單的查詢,商戶可以通過查詢訂單接口主動查詢訂單狀態(tài),完成下一步的業(yè)務(wù)邏輯。 本文是【淺析微信支付】系列文章的第七篇,主要講解微信商戶平臺的訂單查詢和關(guān)閉接口的使用。 淺析微信支付系列已經(jīng)更新六篇了喲~,沒有看過的朋友們可以看一下哦。 ...
摘要:淺析微信支付微信公眾號網(wǎng)頁授權(quán)本文是淺析微信支付系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁授權(quán)及用戶信息獲取。淺析微信支付系列已經(jīng)更新三篇了喲,沒有看過的朋友們可以看一下哦。 淺析微信支付:微信公眾號網(wǎng)頁授權(quán) 本文是【淺析微信支付】系列文章的第四篇,主要講解微信支付前如何獲取獲取網(wǎng)頁授權(quán)及用戶信息獲取。 淺析微信支付系列已經(jīng)更新三篇了喲~,沒有看過的朋友們可以看一下哦。 淺...
閱讀 3486·2021-11-18 10:07
閱讀 1586·2021-11-04 16:08
閱讀 1502·2021-11-02 14:43
閱讀 1083·2021-10-09 09:59
閱讀 838·2021-09-08 10:43
閱讀 1073·2021-09-07 09:59
閱讀 954·2019-12-27 11:56
閱讀 994·2019-08-30 15:56