强制JavaScript setTimout函数在x毫秒后运行

时间:2019-02-14 19:13:07

标签: javascript loops events timeout

我正在尝试制作一个超时函数,以防函数挂起时间太长而引发错误。

我有以下代码:

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秒后执行,而不管发生了什么事情。我该如何实现?

4 个答案:

答案 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++;
}