我正在尝试制作一个超时函数,以防函数挂起时间太长而引发错误。
我有以下代码:
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秒后执行,而不管发生了什么事情。我该如何实现?
答案 0 :(得分:0)
我希望我的超时功能在2秒后执行,而不管其他情况如何。我该如何实现?
你不能真的。如您所怀疑,该问题与事件循环有关。只有一个线程可供您使用,并且已将其置于无限循环中。由于您再也不会回来,因此事件循环没有机会运行setTimeout指定的函数。
如果您希望while循环停止,则while循环必须是停止它的循环。也许是这样的:
const before = Date.now();
while (true) {
// do stuff
if (Date.now() - before > 2000) {
throw new Error('Timed Out!');
}
}
答案 1 :(得分:0)
我认为这是因为您首先进入无限循环,然后再也不退出,所以您的settimeout将永远不会触发。
我不知道您要达到什么目的,但是如果您想抛出错误,请在settimeout的最后移动while循环。 没道理
答案 2 :(得分:0)
setTimeout()
不能按照您的想法工作。直到while循环运行。 setTimeout()
函数不会被调用。
JavaScript不支持多线程,因为它是一种解释型语言。 多线程:是一种执行模型,它允许存在多个线程。See more
下面是示例。
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)
答案 3 :(得分: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++;
}