for...of
循环本身 不是异步的,它是同步执行的。这意味着 for...of
循环会按顺序依次执行每一项,直到循环结束。如果循环中的操作是异步的(例如,async
函数或者 Promise
),则这些异步操作会并发执行,但 for...of
本身不会等待这些操作完成,除非你显式地处理它们。
让我们通过一个例子来说明这个行为:
示例 1:同步操作
const arr = [1, 2, 3];
for (const num of arr) {
console.log(num);
}
输出:
1
2
3
这是同步的,for...of
循环会按顺序打印数组中的每个元素。
示例 2:异步操作
如果你在 for...of
中使用异步操作(例如 setTimeout
或者 Promise
),则 for...of
依然会同步执行,不会等待异步操作完成。
const arr = [1, 2, 3];
for (const num of arr) {
setTimeout(() => {
console.log(num);
}, 1000);
}
输出:
1
2
3
尽管每个 setTimeout
都延迟了 1 秒才输出,但 for...of
仍然是同步执行的。它会立即执行每次循环,而不会等待 setTimeout
完成。
异步操作与 await
一起使用
如果你想要 for...of
循环等待异步操作完成,你可以在 for...of
中使用 async/await
来实现:
async function processArray(arr) {
for (const num of arr) {
await new Promise(resolve => setTimeout(() => {
console.log(num);
resolve();
}, 1000));
}
}
processArray([1, 2, 3]);
输出:
1
(等待 1 秒)
2
(等待 1 秒)
3
在这个例子中,await
使得 for...of
循环在每个异步操作(setTimeout
)完成后才继续执行,因此输出是顺序的,每个数字间隔 1 秒。
总结
for...of
循环是同步的,它会按顺序执行每一项。- 如果循环中包含异步操作(例如
Promise
或setTimeout
),它不会等待异步操作完成,除非使用async/await
来显式地等待异步操作完成。