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