下一个设置超时 js/react
Settimeout in next js/react
let i = 0
function pollDOM() {
console.log(i)
i++
setTimeout(pollDOM, 3000) // try again in 300 milliseconds
}
pollDOM()
以上函数每 3 秒使用 运行,输出如下:
1
// wait 3 seconds
2
// wait 3 seconds
3
// wait 3 seconds
4
// wait 3 seconds, and so on...
但在 Next.js 中,它产生的结果为:
1
2
// wait for 3 seconds
3
4
// wait for 3 seconds
5
6
// wait for 3 seconds, and so on...
为什么会这样产生,两个数在一起?
我怎样才能达到我在正常 JavaScript 中达到的目标?
因为当您的组件第二次呈现时,您将再次添加 setTimeout
。您必须清除超时并使用 useEffect
仅在组件被装箱时设置一次。此外,当您必须每 x 秒重复一次时,请使用 setInteval
而不是递归函数。尝试:
useEffect(() => {
let i = 0;
function pollDOM() {
console.log(i);
i++;
}
const interval = setInterval(pollDOM, 3000);
return () => clearInterval(interval);
}, [])
let i = 0
function pollDOM() {
console.log(i)
i++
setTimeout(pollDOM, 3000) // try again in 300 milliseconds
}
pollDOM()
以上函数每 3 秒使用 运行,输出如下:
1
// wait 3 seconds
2
// wait 3 seconds
3
// wait 3 seconds
4
// wait 3 seconds, and so on...
但在 Next.js 中,它产生的结果为:
1
2
// wait for 3 seconds
3
4
// wait for 3 seconds
5
6
// wait for 3 seconds, and so on...
为什么会这样产生,两个数在一起?
我怎样才能达到我在正常 JavaScript 中达到的目标?
因为当您的组件第二次呈现时,您将再次添加 setTimeout
。您必须清除超时并使用 useEffect
仅在组件被装箱时设置一次。此外,当您必须每 x 秒重复一次时,请使用 setInteval
而不是递归函数。尝试:
useEffect(() => {
let i = 0;
function pollDOM() {
console.log(i);
i++;
}
const interval = setInterval(pollDOM, 3000);
return () => clearInterval(interval);
}, [])