方法一:没问题
(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()