javascript - async/await 與 forEach 問(wèn)題
問(wèn)題描述
方法一:沒(méi)問(wèn)題
(async function () {for (let i = 0; i < triggerArr.length; ++i) { await sleep(); triggerArr[i]();} })();
方法二:是一起輸出來(lái)的,為什么?(沒(méi)有等待)
const test = async function (item) { await sleep(); item(); }; triggerArr.forEach(test);
全部的代碼
function signalLamp(singalArr) { function tic(sign, delay) {return () => new Promise((res, rej) => { setTimeout(() => {res();console.log(sign); }, delay || 1000);}); } const rawArr = singalArr.slice(); const triggerArr = rawArr.reduce(function (prev, item) {return prev.concat([tic(item, 1000)]); }, []); const sleep = () => new Promise((res, rej) => setTimeout(res, 1000)); /* Method 1 */ (async function () {for (let i = 0; i < triggerArr.length; ++i) { await sleep(); triggerArr[i]();} })(); /* Method 2 */ // const test = async function (item) { // await sleep(); // item(); // }; // triggerArr.forEach(test);}signalLamp([’red’, ’green’, ’yellow’]);
問(wèn)題解答
回答1:我給你講下。await 只能用于 async 聲明的函數(shù)上下文中. 如下 forEach 中, 是不能直接使用await的.
let array = [0,1,2,3,4,5];(async ()=>{ array.forEach(function(item){ console.log(item); await wait(1000);//這是錯(cuò)誤的寫(xiě)法 });})();//因await只能用于 async 聲明的函數(shù)上下文中, 故不能寫(xiě)在forEach內(nèi).下面我們來(lái)看正確的寫(xiě)法(async ()=>{ for(let i=0,len=array.length;i<len;i++){ console.log(array[i]); await wait(1000); }})();
仔細(xì)看下,發(fā)現(xiàn)你的問(wèn)題是另外一種情況。你這樣把test當(dāng)做回調(diào)函數(shù)傳入進(jìn)去,sleep方法是同步執(zhí)行的,await還是生效的,只是同時(shí)生效。因此后續(xù)函數(shù)在等待相同的時(shí)間后,一起執(zhí)行。
回答2:async 做異步循環(huán)的時(shí)候最好用 for ... of ... 或者 Promise.all()
相關(guān)文章:
1. angular.js - angular內(nèi)容過(guò)長(zhǎng)展開(kāi)收起效果2. 關(guān)于nginx location配置的問(wèn)題,root到底是什么3. angular.js - angularjs的自定義過(guò)濾器如何給文字加顏色?4. docker鏡像push報(bào)錯(cuò)5. 關(guān)于docker下的nginx壓力測(cè)試6. 大家好,請(qǐng)問(wèn)在python腳本中怎么用virtualenv激活指定的環(huán)境?7. 并發(fā)模型 - python將進(jìn)程池放在裝飾器里為什么不生效也沒(méi)報(bào)錯(cuò)8. python的前景到底有大?如果不考慮數(shù)據(jù)挖掘,機(jī)器學(xué)習(xí)這塊?9. python 怎樣用pickle保存類的實(shí)例?10. python2安裝失敗
