摘要:總結(jié)異步編程解決方案可理解為一種狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)可返回一個(gè)指向內(nèi)部狀態(tài)的指針對(duì)象遍歷器對(duì)象,所以可理解為其是一個(gè)遍歷器對(duì)象生成函數(shù)產(chǎn)出定義不同的內(nèi)部狀態(tài),后跟表達(dá)式。
created at 2019-04-08總結(jié)
異步編程解決方案
可理解為一種狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)
可返回一個(gè)指向內(nèi)部狀態(tài)的指針對(duì)象(遍歷器對(duì)象Interator),所以可理解為其是一個(gè)遍歷器對(duì)象生成函數(shù)
yield(產(chǎn)出),定義不同的內(nèi)部狀態(tài),yield后跟表達(dá)式。
yield 表達(dá)式只能放在Generator函數(shù)中
(yield 表達(dá)式) 整個(gè)沒(méi)有返回值,next()的參數(shù)可以被認(rèn)為是上一個(gè)yield的返回值。
V8引擎直接忽略第一次next()的參數(shù),因?yàn)闆](méi)有上一次yield
調(diào)用next方法,是指針從函數(shù)頭部或上一次停止的地方開(kāi)始執(zhí)行,直到遇到下一個(gè)yield表達(dá)式或return
當(dāng)next的返回值的value屬性為yield后表達(dá)式的結(jié)果或return后的值,done屬性為true時(shí)表示遍歷yield結(jié)束
對(duì)象中使用const obj = { myGeneratorMethod(){} } 等同于 obj = { myGeneratorMethod:function (){} }
yield* 用于在一個(gè)generator函數(shù)中執(zhí)行另一個(gè)generator函數(shù),并且會(huì)將另一個(gè)的yield全部執(zhí)行完畢才會(huì)繼續(xù)執(zhí)行當(dāng)前generator中的yield
基礎(chǔ)語(yǔ)法function* generatorTest() { console.log("第一個(gè)yield之前的語(yǔ)句"); yield "yield 1" yield "yield 3: 在表達(dá)式中要加括號(hào)" + (yield "yield 2: in expression") console.log("yield 之后 return之前"); return "return" } const gt = generatorTest() console.log(gt); // 遍歷器對(duì)象 /* * 第一次調(diào)用是從函數(shù)頭部開(kāi)始執(zhí)行,如果沒(méi)有yield,也需要執(zhí)行一次next才會(huì)執(zhí)行這些語(yǔ)句 */ console.log(gt.next()); // 第一個(gè)yield之前的語(yǔ)句 // {value: "yield 1", done: false} console.log(gt.next()); // {value: "yield 2: in expression", done: false} console.log(gt.next()); // {value: "yield 3: 在表達(dá)式中要加括號(hào)undefined", done: false} // 上面出現(xiàn)undefined的原因是next沒(méi)有加參數(shù) console.log(gt.next()); // yield 之后 return之前 // {value: "return", done: true} console.log(gt.next()); // {value: "undefined", done: true}實(shí)現(xiàn)斐波拉契數(shù)列
鏈接
給原生對(duì)象添加Iterator先展示for of 對(duì)generator的作用
function* generatorForOf(){ yield 1; yield 2; return 3; } /* * for of 可以遍歷Generator生成的Iterator對(duì)象 * 這里不能再遍歷 gt 因?yàn)樗褕?zhí)行完畢 * 不會(huì)遍歷return的值 */ for (let item of generatorForOf()) { console.log("for of :", item); }
給原生對(duì)象添加iterator, 讓其可以被for of 遍歷
function* objectAddIterator(obj) { const props = Reflect.ownKeys(obj) for (const key of props) { yield [key, obj[key]] } } const nativeObj = { a: 12, b: 34, [Symbol("symbol c")]: 3 } for (const [key, value] of objectAddIterator(nativeObj)) { console.log(typeof key === "symbol" ? key.description : key, value); }應(yīng)用場(chǎng)景 異步ajax請(qǐng)求
代碼中的loading函數(shù)代碼行數(shù)較多,也并非關(guān)鍵代碼,所以不作展示。查看loading代碼
初始數(shù)據(jù)
function requestData(callback) { function ajaxFn() { setTimeout(() => { ar.next("ajax返回結(jié)果") }, 2000); } function* asyncReqData() { loading(true) const result = yield ajaxFn() callback(result) loading(false) } const ar = asyncReqData() ar.next() } function getSomeList() { requestData((res) => { document.getElementById("ajax").innerHTML = res }) }控制同步操作的流程
function controlFlow() { const child1 = [() => {console.log("--",1); return "return 1"}, () => {console.log("--",2); return "return 2"}] const child2 = [() => {console.log("--",3); return "return 3"}, () => {console.log("--",4); return "return 4"}] function* generatorControl(child) { console.log("==========="); for (let i = 0; i < child.length; i++) { yield child[i]() } } let parent = [{c: child1}, {c: child2}]; function* parentFn(p){ for (let i=0; i< p.length; i++){ yield* generatorControl(p[i].c); } } for (let step of parentFn(parent)) { console.log(step); } } controlFlow()
本文包括對(duì)generate基礎(chǔ)的學(xué)習(xí)與練習(xí),與一些心得!【會(huì)持續(xù)學(xué)習(xí),更新】
詳細(xì)學(xué)習(xí)請(qǐng)移步下方參考鏈接
參考:
參考文章
歡迎交流 Github
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103321.html
摘要:返回的結(jié)果是一個(gè)對(duì)象,類似于表示本次后面執(zhí)行之后返回的結(jié)果。對(duì)象用于一個(gè)異步操作的最終完成或失敗及其結(jié)果值的表示簡(jiǎn)單點(diǎn)說(shuō)就是處理異步請(qǐng)求。源碼分析主要脈絡(luò)函數(shù)調(diào)用后,返回一個(gè)實(shí)例。參考鏈接解釋對(duì)象的用法的源碼及其用法 本文始發(fā)于我的個(gè)人博客,如需轉(zhuǎn)載請(qǐng)注明出處。為了更好的閱讀體驗(yàn),可以直接進(jìn)去我的個(gè)人博客看。 前言 知識(shí)儲(chǔ)備 閱讀本文需要對(duì)Generator和Promise有一個(gè)基本的...
摘要:目前,生成對(duì)抗網(wǎng)絡(luò)的大部分應(yīng)用都是在計(jì)算機(jī)視覺(jué)領(lǐng)域。生成對(duì)抗網(wǎng)絡(luò)生成對(duì)抗網(wǎng)絡(luò)框架是由等人于年設(shè)計(jì)的生成模型。在設(shè)置中,兩個(gè)由神經(jīng)網(wǎng)絡(luò)進(jìn)行表示的可微函數(shù)被鎖定在一個(gè)游戲中。我們提出了深度卷積生成對(duì)抗網(wǎng)絡(luò)的實(shí)現(xiàn)。 讓我們假設(shè)這樣一種情景:你的鄰居正在舉辦一場(chǎng)非常酷的聚會(huì),你非常想去參加。但有要參加聚會(huì)的話,你需要一張?zhí)貎r(jià)票,而這個(gè)票早就已經(jīng)賣完了。而對(duì)于這次聚會(huì)的組織者來(lái)說(shuō),為了讓聚會(huì)能夠成功舉...
摘要:返回后,代表操作已完成,記錄結(jié)束時(shí)間并輸出。從零組裝因?yàn)閷?duì)的學(xué)習(xí)和使用,知道了自己對(duì)于后臺(tái)框架的真實(shí)需求。所以這回決定不用之內(nèi)的工具,而是自己從零開(kāi)始,組裝一個(gè)適合自己的框架。就是去和上,尋找一個(gè)一個(gè)的包并組裝在一起了而已。 起因 作為一個(gè)前端,Node.js算是必備知識(shí)之一。同時(shí)因?yàn)樽约盒枰鲆恍┖笈_(tái)性的工作,或者完成一個(gè)小型應(yīng)用。所以學(xué)習(xí)了Node的Express框架,用于輔助和加...
摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫(xiě)一個(gè)符合規(guī)范并可配合使用的寫(xiě)一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來(lái)處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問(wèn)題描述 在開(kāi)發(fā)過(guò)程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過(guò)http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過(guò)...
摘要:調(diào)用函數(shù)后和普通函數(shù)不同的是,該函數(shù)并不立即執(zhí)行,也不返回函數(shù)執(zhí)行結(jié)果,而是返回一個(gè)指向內(nèi)部狀態(tài)的對(duì)象,也可以看作是一個(gè)遍歷器對(duì)象。第一個(gè)只是用來(lái)啟動(dòng)函數(shù)內(nèi)部的遍歷器,傳參也沒(méi)有多大意義。 之前斷斷續(xù)續(xù)接觸到了一些ES6的知識(shí),異步編程方面聽(tīng)得比較多的就是Promise,直到最近比較系統(tǒng)地學(xué)習(xí)了ES6的新特性才發(fā)現(xiàn)Generator這個(gè)神奇的存在,它可以實(shí)現(xiàn)一些前所未有的事情,讓我頓時(shí)...
閱讀 2311·2021-11-23 09:51
閱讀 3748·2021-11-11 10:57
閱讀 1391·2021-10-09 09:43
閱讀 2481·2021-09-29 09:35
閱讀 2013·2019-08-30 15:54
閱讀 1788·2019-08-30 15:44
閱讀 3179·2019-08-30 13:20
閱讀 1687·2019-08-30 11:19