我正在尝试创建一个超时函数,该函数在函数挂起太久时会引发错误。
我有以下代码:
function go() {
try{
console.log('started, timeout in 2 seconds...');
setTimeout(()=>{
throw new Error('Timed Out!');
}, 2000);
while(true){
//will run forever
}
}catch (e) {
console.log('timeout function worked!');
}
}
go();
但是,永远不会引发错误。我认为这是因为事件循环在 JS 中的工作方式,但我希望我的超时函数在 2 秒后执行,无论发生什么。我如何实现这一点?
我的超时函数在 2 秒后执行,无论发生什么其他事情。我如何实现这一点?
你真的不能。如您所怀疑,该问题与事件循环有关。只有一个线程可供您使用,并且您已经将其放入无限循环中。由于您永远不会返回,因此事件循环没有机会运行 setTimeout 指定的函数。
如果您希望 while 循环停止,则 while 循环需要是停止它的人。也许是这样的:
const before = Date.now();
while (true) {
// do stuff
if (Date.now() - before > 2000) {
throw new Error('Timed Out!');
}
}
我认为这是因为您首先进入无限循环并且永远不会出去,因此您的设置超时永远不会触发。
我不知道您要实现什么,但是如果您想抛出错误,请在最后的设置超时内移动while循环。 顺便说一句,这毫无意义
setTimeout()
不能像你想象的那样工作。直到 while 循环运行。不会调用setTimeout()
函数。
Javascript不支持多线程,因为它是一种解释性语言。多线程:是一种允许多个线程存在的执行模型。查看更多
下面是示例。
function loop(){
console.time('time');
for(let i = 0;i<10000000;i++){
if(i % 2000000 === 0) console.log("I am looping");
}
console.timeEnd('time');
console.log("Loop finished");
}
loop();
setTimeout(() => {
console.log("I am logged from setTimeout")
},0)
如果事件循环无法继续,则无法执行任何操作。但是,下面的代码应该更接近您要查找的内容。如果需要执行 while 语句,请进一步执行代码。
function go() {
try{
var timeout = setTimeout(()=>{
throw new Error('Timed Out!');
}, 2000);
//do stuff; it can't hog the event loop
}catch(e){
}
clearTimeout(timeout);
return true; //return value
}
go();
var iterations = 0;
while(condition && iterations < 10){
//do stuff
iterations++;
}