摘要:文章同步自個人博客此前只是簡單使用而沒有真正的去研究,這次要好好折騰下這貨。我們要實現(xiàn)一個啟動器來運行它,并把結(jié)果傳給下一次,這樣就實現(xiàn)了接收值的功能。就啟動起來了,并且一直執(zhí)行到為為止。如果執(zhí)行不了,請升級瀏覽器,本例在下通過。
文章同步自個人博客:http://www.52cik.com/2016/07/11/generator-co.html
此前只是簡單使用而沒有真正的去研究 Generator,這次要好好折騰下這貨。
異步編程對于 jser 來說,異步非常熟悉了吧,但是真正理解異步的卻不多,因為大部分人只知道回調(diào)。
隨著js的快速發(fā)展,異步方案也層出不窮,從最開始的回調(diào)到Promise,再到Generator,然后到async/await。
甚至有人說 async/await 是異步的終極解決方案,我不敢直接贊同,只能說是目前最好的異步體驗。
本篇先從 Generator 講起,后序再詳細(xì)說 async/await。
從最最經(jīng)典的 ajax 請求開始今天的話題吧。
假如,我們要依次請求 url1, url2, url3 這3個地址。
$.get("url1", function(r1) { $.get("url2", function(r2) { $.get("url3", function(r3) { console.log(r1, r2, r3); }); }); });
一不小心就寫成這樣了。
如果你是 jQuery 粉的話,你可能會說也可以這樣實現(xiàn)啊。
$.get("url1").then(function(r1) { console.log(r1); return $.get("url2"); }).then(function(r2) { console.log(r2); return $.get("url3"); }).then(function(r3) { console.log(r3); });
用 jQuery 的 Deferred 對象,類似 Promise 來規(guī)避回調(diào)地獄,看著確實平了,但體驗并不是特別友好。
用 Generator 來和諧回調(diào)Generator 的基礎(chǔ)這里就不展開說了,直接說應(yīng)用。
function* gen() { var r1 = yield $.get("url1"); var r2 = yield $.get("url2"); var r3 = yield $.get("url3"); console.log(r1, r2, r3); }
這是比較友好的異步方式,但是還有個至關(guān)重要的因素,怎么運行這個 Generator 是個問題。
直接手動 g.next() 運行那肯定不行,鬼知道有多少個 yield。
我們要實現(xiàn)一個啟動器來運行它,并把 Promise 結(jié)果傳給下一次next,這樣就實現(xiàn)了 yield 接收值的功能。
先來實現(xiàn)一個最簡陋的起動器。
function run(gen) { var g = gen(); function next(d) { var r = g.next(d); r.done || r.value.then(function(d){ next(d) }); // 這個是關(guān)鍵,把值傳回傳 } next(); }
然后我們只要一行代碼。
run(gen);
Generator 就啟動起來了,并且一直執(zhí)行到 done 為 true 為止。
真實例子打開 http://www.52tian.net/ 動漫網(wǎng)。非廣告,確實沒找到合適的測試站,湊合下吧。
然后把下面代碼貼到控制臺,看下結(jié)果。如果執(zhí)行不了,請升級瀏覽器,本例在 chrome 51 下通過。
function* gen() { var r1 = yield $.get("/json/anime/4126.htm"); var r2 = yield $.get("/json/anime/11129.htm"); var r3 = yield $.get("/json/anime/427.htm"); console.log([r1, r2, r3].join(" ")); } function run(gen) { var g = gen(); function next(d) { var r = g.next(d); r.done || r.value.then(function(d){ next(d) }); // 這個是關(guān)鍵,把值傳回傳 } next(); } run(gen);小結(jié)
可能你已經(jīng)發(fā)現(xiàn)了,其實這就是 co 的原理,但 co 比這個例子嚴(yán)謹(jǐn)多了,而且api設(shè)計的也非常友好。
本篇到此也就結(jié)束了,利用 Generator 的 yield 功能實現(xiàn)參數(shù)回傳,讓代碼看起來非常‘同步’,讓異步體驗變的更加友好。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79969.html
摘要:自定義前端構(gòu)建工具生成器近期公司前端一直在做效率提升,流程優(yōu)化,很榮幸這個擔(dān)子落在了我身上,除了一些培訓(xùn),分享之外,自己弄了個基于的前端構(gòu)建環(huán)境生成器,在此分享給大家,覺得有用的請試用。,不出意料的話,構(gòu)建環(huán)境已經(jīng)生成完畢了。 自定義前端構(gòu)建工具生成器generator-pg-cloud 近期公司前端一直在做效率提升,流程優(yōu)化,很榮幸這個擔(dān)子落在了我身上,除了一些培訓(xùn),分享之外,自己...
摘要:換句話說,我們很好的對代碼的功能關(guān)注點進行了分離通過將使用消費值得地方函數(shù)中的邏輯和通過異步流程來獲取值迭代器的方法進行了有效的分離。但是現(xiàn)在我們通過來管理代碼的異步流程部分,我們解決了回調(diào)函數(shù)所帶來的反轉(zhuǎn)控制等問題。 本文翻譯自 Going Async With ES6 Generators 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,還望指正Issue ES6 Gener...
摘要:文章同步自個人博客上一篇讓自啟動介紹了通過起動器讓跑起來,而本篇采用實現(xiàn)更優(yōu)雅的異步編程。而采用寫,代碼則是直接運行即可直接運行了,無須寫生成器來運行了,而代碼僅僅是改為改為而已。不過效果確實非常好,讓異步編程更加的同步了。 文章同步自個人博客:http://www.52cik.com/2016/07/11/generator-co.html 上一篇《讓 Generator 自啟動》介...
摘要:上下文路徑為了方便文件流的輸入輸出,使用兩種位置環(huán)境。目標(biāo)上下文目標(biāo)上下文定義為當(dāng)前工作目錄或含文件最接近的父文件夾。這確保了用戶行為的一致。幫助用戶嚴(yán)重需要覆蓋的內(nèi)容。 摘要 隨著 Web 2.0 和 HTML 5 的流行,現(xiàn)在的 Web 應(yīng)用所能提供的功能和交互能力比之前傳統(tǒng)的 Web 應(yīng)用要強大很多。應(yīng)用的很多實現(xiàn)邏輯被轉(zhuǎn)移到了瀏覽器端來實現(xiàn)。瀏覽器不再只提供單一的數(shù)據(jù)接收和展現(xiàn)...
閱讀 1640·2023-04-25 18:19
閱讀 2084·2021-10-26 09:48
閱讀 1083·2021-10-09 09:44
閱讀 1736·2021-09-09 11:35
閱讀 3030·2019-08-30 15:54
閱讀 2029·2019-08-30 11:26
閱讀 2290·2019-08-29 17:06
閱讀 890·2019-08-29 16:38