Node.js setTimeout在while循环中不起作用?

代码如上所示,但实际上setTimeout一直没有被执行,死循环了。就算用new Promise().then(),setTimeout也还是不执行。这是为什么?代码该如何改才能正常执行?


setTimeout
被调用时,它会在指定的时间后将回调函数添加到事件循环队列中。在while
循环中,由于代码在循环中被同步执行,事件循环被阻塞,因此setTimeout
中指定的回调函数不会被添加到事件循环队列中,直到循环结束。
这意味着,如果在

while
循环中使用setTimeout
,则所有的回调函数都会在循环结束后立即执行,而不是在指定的时间后执行。
为了解决这个问题,可以考虑使用

setInterval
或者递归函数来代替setTimeout
,或者将setTimeout
放在异步函数中执行,以确保回调函数被添加到事件循环队列中。例如:
function doSomething() { // do something... setTimeout(function() { // do something after 1000ms... }, 1000);}// 异步函数中执行 setTimeoutasync function doSomethingAsync() { // do something... await new Promise(resolve => setTimeout(resolve, 1000)); // do something after 1000ms...}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-07-25
这段代码是一个错误的示例,因为在 Node.js 中的事件循环机制导致 setTimeout 函数无法按预期工作。在上面的代码中,while 循环会一直运行,不会等待 setTimeout 函数执行完成。因此,setTimeout 的回调函数永远不会被触发。
如果要在循环中使用 setTimeout 函数,可以考虑使用递归或者使用 Promise 或 async/await 等异步操作来实现。例如,可以使用递归来执行多个 setTimeout 函数,每次循环内调用一个 setTimeout,并在其回调函数中递归调用下一次 setTimeout。这样可以模拟出延迟效果:
var temp1 = 0;
function myFunc() {
if (temp1 < 5) {
console.log("doing");
temp1 += 1;
setTimeout(myFunc, 1000);
} else {
console.log("done");
}
}
myFunc();
这段代码会每隔一秒输出一次 "doing",并在循环结束后输出一次 "done"。通过递归调用 setTimeout,可以确保每次 setTimeout 的回调函数执行时都在上一个 setTimeout 的回调函数执行完成之后。
相似回答
大家正在搜