摘要:文章同步自個人博客上一篇讓自啟動介紹了通過起動器讓跑起來,而本篇采用實現更優雅的異步編程。而采用寫,代碼則是直接運行即可直接運行了,無須寫生成器來運行了,而代碼僅僅是改為改為而已。不過效果確實非常好,讓異步編程更加的同步了。
文章同步自個人博客:http://www.52cik.com/2016/07/11/generator-co.html
上一篇《讓 Generator 自啟動》介紹了通過起動器讓 Generator 跑起來,而本篇采用 async 實現更優雅的異步編程。
從例子開始借用上一篇例子中的例子說起。
function* gen() { var r1 = yield $.get("url1"); var r2 = yield $.get("url2"); var r3 = yield $.get("url3"); console.log(r1, r2, r3); }
然后,我們需要寫一個啟動器來啟動這個函數。
而采用 async 寫,代碼則是:
async function gen() { var r1 = await $.get("url1"); var r2 = await $.get("url2"); var r3 = await $.get("url3"); console.log([r1, r2, r3].join(" ")); } gen(); // 直接運行即可
直接運行了,無須寫生成器來運行了,而代碼僅僅是 * 改為 async, yield 改為 await 而已。
所以本質上講:async 就是 Generator 的語法糖。
多任務處理有個坑,就是不能直接在 forEach, map 之類的方法里處理,否則會報錯或者得到錯誤的結果。
function sleep(t) { return new Promise(resolve => setTimeout( _ => { resolve(+new Date) }, t)) } async function run() { // 順序 let a = await sleep(100) let b = await sleep(200) // 并發1 let c = await Promise.all([sleep(100), sleep(200), sleep(300)]) // 并發2 let d = await Promise.all([100, 200, 300].map(t => sleep(t))) // 并發3 let list = [sleep(100), sleep(200), sleep(300)] let e = [] for (let fn of list) { e.push(await fn) } console.log( "", "a:", a, " ", "b:", b, " ", "c:", c, " ", "d:", d, " ", "e:", e, " " ) } run() // a: 1468317737179 // b: 1468317737384 // c: [ 1468317737485, 1468317737589, 1468317737688 ] // d: [ 1468317737792, 1468317737890, 1468317737989 ] // e: [ 1468317738094, 1468317738193, 1468317738293 ]小結
async 沒多大的變動,歸根結底就是個語法糖,幫助我們運行生成器,而不需要我們自己寫起動器了。
不過效果確實非常好,讓異步編程更加的同步了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79981.html
摘要:但是的的出現碉堡的新朋友,我們可以輕松寫出同步風格的代碼同時又擁有異步機制,可以說是目前最簡單,最優雅,最佳的解決方案了。不敢說這一定是終極的解決方案,但確實是目前最優雅的解決方案 一、異步解決方案的進化史 JavaScript的異步操作一直是個麻煩事,所以不斷有人提出它的各種解決方案。可以追溯到最早的回調函數(ajax老朋友),到Promise(不算新的朋友),再到ES6的Gener...
摘要:順序執行異步函數異步為帶來非阻塞等優勢的同時,同時也在一些場景下帶了不便,如順序執行異步函數,下面總結了一些常用的方法。 火于異步 1995年,當時最流行的瀏覽器——網景中開始運行 JavaScript (最初稱為 LiveScript)。 1996年,微軟發布了 JScript 兼容 JavaScript。隨著網景、微軟競爭而不斷的技術更新,在 2000年前后,JavaScript ...
摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規范并可配合使用的寫一個符合規范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環代替(異步)遞歸 問題描述 在開發過程中,遇到一個需求:在系統初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...
摘要:如果我們只有一個異步操作,用回調函數來處理是完全沒有任何問題的。事件監聽使用事件監聽的方式番禺廣州上述代碼需要實現一個事件監聽器。只處理對象廣州番禺函數將函數的自動執行器,改在語言層面提供,不暴露給用戶。 概論 由于 JavaScript 是一門單線程執行的語言,所以在我們處理耗時較長的任務時,異步編程就顯得尤為重要。js 處理異步操作最傳統的方式是回調函數,基本上所有的異步操作都可以...
閱讀 3044·2021-11-22 09:34
閱讀 3636·2021-08-31 09:45
閱讀 3836·2019-08-30 13:57
閱讀 1670·2019-08-29 15:11
閱讀 1681·2019-08-28 18:04
閱讀 3218·2019-08-28 17:59
閱讀 1558·2019-08-26 13:35
閱讀 2188·2019-08-26 10:12