#方法一:沒問題
(async function () {
for (let i = 0; i < triggerArr.length; ++i) {
await sleep();
triggerArr[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']);
我跟你講下。
await 只能用於 async 聲明的函數上下文中. 如下 forEach 中, 是不能直接使用await的.
仔細看下,發現你的問題是另外一種情況。
你這樣把test當作回呼函數傳入進去,sleep方法是同步執行的,await還是生效的,只是同時生效。因此後續函數在等待相同的時間後,一起執行。
async 做非同步循環的時候最好用 for ... of ... 或 Promise.all()