gpt4 book ai didi

JavaScript:setInterval() 不会产生预期的输出

转载 作者:行者123 更新时间:2023-11-28 12:54:27 24 4
gpt4 key购买 nike

请看一下我下面的代码,我不知道为什么它会产生预期的输出。我认为我使用 setInterval() 和 setTimeout 的方式是错误的。不知怎的,这个过程从上到下并没有按 1 个顺序进行。看起来有3个线程并行运行。我该如何修复它?谢谢。

(function() {
var nums = [1, 2, 3];
nums.forEach(
(e) => {
console.log(e);
var frame = 0;
let loop = setInterval(function() {
if (frame === 3)
clearInterval(loop);
console.log(e + " frame " + frame);
frame++;
}, 1000);
let wait = setTimeout(function() {
console.log(e + " 2 second passed");
}, 2000);
}
)
})();

预期输出:

1
1 frame 0
1 frame 1
1 frame 2
1 2 seconds passed
2
2 frame 0
2 frame 1
2 frame 2
2 2 seconds passed
3
3 frame 0
3 frame 1
3 frame 2
3 2 seconds passed

实际输出:

1
2
3
1 frame 0
2 frame 0
3 frame 0
1 frame 1
1 2 second passed
2 frame 1
2 2 second passed
3 frame 1
3 2 second passed
1 frame 2
2 frame 2
3 frame 2
1 frame 3
2 frame 3
3 frame 3

最佳答案

因为 Javascript 是异步的,所以您需要某种方法来等待每个间隔和超时完成,然后再运行下一个。

实现此目的的一种方法是使用 async/await并将间隔和超时包装在 promise 中.

(async function() {
var nums = [1, 2, 3];
for (const e of nums) {
console.log(e);
let frame = 0;
await new Promise(resolve => {
let loop = setInterval(function() {
if (frame === 3) {
clearInterval(loop);
resolve();
} else {
console.log(e + " frame " + frame);
frame++;
}

}, 100);
})
await new Promise(resolve => {
let wait = setTimeout(function() {
console.log(e + " 2 second passed");
resolve();
}, 200);
})
}
})();

关于JavaScript:setInterval() 不会产生预期的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56963858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com