如果执行时间太长,则跳过该功能.JavaScript的

tru*_*h13 5 javascript asynchronous functional-programming

如果执行时间太长,我怎么能跳过一个函数.

例如,我有3个功能:

function A(){
 Do something.. ..
}

function B(){
 Do something.. ..
}

function C(){
 Do something.. ..
}

A();
B();
C();
Run Code Online (Sandbox Code Playgroud)

因此,例如由于某种原因,函数B内部具有无限循环,并继续运行.如果功能B执行时间过长,如何跳过功能B并转到功能C?

我尝试了这个,但似乎不起作用:

try {
 const setTimer = setTimeOut({ 
  throw new Error("Time out!");
 },500);
 B();
 clearInterval(setTimer);
}
catch(error){
 console.warn(error);
}
Run Code Online (Sandbox Code Playgroud)

但似乎没有用.


更新1:仅供参考,我没有做任何反模式,但功能B是NPM中的东西,我向回购的所有者提交了问题.只是试图躲避子弹,所以我有一些额外的时间,直到修复.谢谢你们帮助我到目前为止:)

kem*_*ica 6

setTimeout 不能用于停止函数的执行

setTimeout不能用于取消函数的执行。setTimeout只是调用函数之前的延迟。这只是意味着,是的,您可以在执行之前停止它,但一旦执行,您就不能停止它。

通过检查经过的时间来停止(不推荐)。

解决方案是通过在函数中的各处放置检查来检查函数花费了多少时间。

function A(mili){
  const end = Date.now() + mili;
  for(let i = 0; i < 10000; i++){
    for(let j = 0; j < 10000; j++){
      if(Date.now() > end){
        console.log(mili + ": Halting A...");
        return;
      }
    }
  }
  
}

A(100); //halted
A(1000); //halted
A(10000); //passed
Run Code Online (Sandbox Code Playgroud)

但这并不能解决您的问题,也不建议这样做,因为它要求您在函数执行期间可能花费太长时间的关键点添加许多“检查”。

使用函数发生器停止

这是假设您处于同步环境中

函数发生器不是一个完美的解决方案,但它是一个更好的解决方案。

它需要对原始函数进行两次易于理解的修改。

  1. 添加*到您的函数名称
  2. yield在函数中可能被视为“执行时间长”的关键位置添加关键字

最后,将您想要在某个包装器中测试的函数传递给run下面提供的方法。

function* A(){
  for(let i = 0; i < 10000; i++){
    for(let j = 0; j < 1000; j++){
       yield;
    }
  }
  return "some final value";
}

function run(gen, mili){
  const iter = gen();
  const end = Date.now() + mili;
  do {
    const {value,done} = iter.next();
    if(done) return value;
    if(end < Date.now()){
      console.log("Halted function, took longer than " + mili + " miliseconds");
      return null;
    }
  }while(true);
}

console.log("Running...");
const res1 = run(A, 1000);
const res2 = run(A, 5000);
const res3 = run(A, 100);

console.log("run(A,1000) = " + res1); //halted
console.log("run(A,5000) = " + res2); //passed
console.log("run(A,100) = " + res3); //halted
Run Code Online (Sandbox Code Playgroud)