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