这会在循环运行时立即启动所有超时,因此所有消息都将在 1 秒内,而不是它们之间的 1 秒。
解决它的一种方法是使超时取决于i.
for (let i = 0; i < 10; i++) {
setTimeout(function() {
// Running some asynchronous tasks here
// ...
console.log("completed task id " + i);
}, 1000 * (i + 1))
}
这是最简单的方法,它在前一个任务开始后 1 秒启动每个任务。
但是,如果任务执行了一些长时间的操作,并且您不想在前一个任务完成 1 秒后开始下一个任务,那么您将需要更复杂的实现。您必须让任务递增i并调用setTimeout()自身来安排下一次迭代,而不是使用循环。
function timeout_fn(i) {
// do slow operation
console.log("completed task id " + i);
i++;
if (i < 10) {
setTimeout(() => timeout_fn(i), 1000);
}
}
setTimeout(() => timeout_fn(0), 1000);