摘要:前段的功能越來越強大,現(xiàn)在實現(xiàn)同步的循環(huán)輸出的方式也越來越多,我們先看一個例子后輸出相信大家對這個比較常見了,原理是因為聲明的為的局部變量,只是定時器,他暫時將內(nèi)部函數(shù)掛起,等到一秒后執(zhí)行,到那個時候,已經(jīng)變成了。后續(xù)會更新,歡迎補充
前段的功能越來越強大,現(xiàn)在實現(xiàn)同步的for循環(huán)輸出的方式也越來越多,我們先看一個例子:
forF(); function forF() { for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000) } } // 1s后輸出:3 3 3
相信大家對這個比較常見了,原理是因為var聲明的i為forF的局部變量,setTimeout只是定時器,他暫時將內(nèi)部函數(shù)掛起,等到一秒后執(zhí)行,到那個時候,i已經(jīng)變成了5。
那么我們的解決辦法有哪些呢?
先上一個es5以前的解決辦法:
forF(); function forF() { for (var i = 0; i < 3; i++) { outF(i); } } function outF(i) { setTimeout(function () { console.log(i); }, 1000*i) } // 0 1 2
因為在循環(huán)中用了外部函數(shù),那么相當于創(chuàng)建了三個outF實例,因為i是基本變量,所以每個實例的i都是不共享的,這里要注意設(shè)置的定時器時間要1000*i;
下面開始用es6的方法實現(xiàn)啦!
1.用塊作用域的let
forF(); function forF() { for (let i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000*i) } }
因為let是塊作用域的,對于setTimeout函數(shù)而言,每次循環(huán)都新創(chuàng)建一個i,每個i不共享
2.await(其實是es7的)
見代碼
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve("ok"); }, time); }) }; // // 用await實現(xiàn)循環(huán)輸出數(shù)字 async function awaitF() { for (var i = 0; i < 3; i++) { await sleep(1000); console.log(i) } } awaitF() // 0 1 2
await顧名思義是等待,他接受一個promise對象,等待他相應(yīng)然后才繼續(xù)執(zhí)行。
注意用await的函數(shù)必須加async關(guān)鍵字
關(guān)于promise,推薦看大白話:https://www.cnblogs.com/lvdab...
3.yeild
function* countAppleSales () { for (var i = 0; i < 3; i++) { yield; console.log(i); } } var appleStore = countAppleSales(); // Generator { } appleStore.next(); nextApp(appleStore); function nextApp(appleStore) { setTimeout(function () { let done = appleStore.next().done; if (!done) { nextApp(appleStore); } }, 1000); }
yield函數(shù)必須定義成function* 外部在調(diào)用此函數(shù)的時候必須用next()方法他才會繼續(xù)執(zhí)行到下個yeild那里,所以這里用遞歸去執(zhí)行。
關(guān)于yeild的知識點百度也很多,可自行百度。
后續(xù)會更新,歡迎補充
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93271.html
摘要:輔之以事件循環(huán),協(xié)程可用于異步處理,尤其是在中。當前支持的協(xié)程基于增強型生成器,于版本開始采用。新的特性中,異步還有兩種新用途異步內(nèi)容管理器和迭代器。 現(xiàn)在 Python 已經(jīng)支持用協(xié)程進行異步處理。但最近有建議稱添加協(xié)程以全面完善 Python 的語言結(jié)構(gòu),而不是像現(xiàn)在這樣把他們作為生成器的一個類型。此外,兩個新的關(guān)鍵字———異步(async)和等待(await),都該添加到 Pyt...
摘要:遍歷器對象調(diào)用方法后,拋出的異常被函數(shù)體捕獲以后,會附帶執(zhí)行下一條語句。 iterator迭代器 在ES6之前遍歷數(shù)組的方法有以下四種: // 第一種 for(var i = 0; i < array.length; i++){ console.log(array[i]) } // 第二種 array.forEach(function(item,index){ cons...
摘要:所以在第一遍閱讀官方文檔的時候,感覺完全是在夢游。通過或者等待另一個協(xié)程的結(jié)果或者異常,異常會被傳播。接口返回的結(jié)果指示已結(jié)束,并賦值。取消與取消不同。調(diào)用將會向被包裝的協(xié)程拋出。任務(wù)相關(guān)函數(shù)安排協(xié)程的執(zhí)行。負責切換線程保存恢復(fù)。 Tasks and coroutines 翻譯的python官方文檔 這個問題的惡心之處在于,如果你要理解coroutine,你應(yīng)該理解future和tas...
摘要:前言轉(zhuǎn)簡體重新排版布局代碼全面使用并且直接附上輸出結(jié)果補充細節(jié)補充內(nèi)容增加例子說明新增和在遍歷情況下怎么使用上文講了關(guān)于執(zhí)行機制單線程同異步任務(wù)事件循環(huán)的知識點我們知道在某一時刻內(nèi)只能執(zhí)行特定的一個任務(wù)并且會阻塞其它任務(wù)執(zhí)行為了解決這個 前言 PS:2018/08/08 轉(zhuǎn)簡體2018/08/09 重新排版布局,代碼全面使用ES6并且直接附上輸出結(jié)果,補充細節(jié)2018/08/13 補充...
閱讀 2245·2021-11-17 09:33
閱讀 2786·2021-11-12 10:36
閱讀 3410·2021-09-27 13:47
閱讀 901·2021-09-22 15:10
閱讀 3499·2021-09-09 11:51
閱讀 1405·2021-08-25 09:38
閱讀 2765·2019-08-30 15:55
閱讀 2619·2019-08-30 15:53