如果执行时间过长,如何跳过函数。
例如我有3个功能:
function A(){
Do something.. ..
}
function B(){
Do something.. ..
}
function C(){
Do something.. ..
}
A();
B();
C();
因此,例如由于某种原因,函数B内部具有无限循环,并保持运行。如果功能B执行时间过长,如何跳过功能B并转到功能C?
我尝试了这个,但似乎不起作用:
try {
const setTimer = setTimeOut({
throw new Error("Time out!");
},500);
B();
clearInterval(setTimer);
}
catch(error){
console.warn(error);
}
但似乎不起作用。
更新1:仅供参考,我没有做任何反模式,但功能B是NPM中的一部分,我向仓库的所有者提交了问题。试着躲开子弹,以便在修复之前我有一些额外的时间。谢谢你们到目前为止对我的帮助:)
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
但这并不能解决您的问题,因此不建议这样做,因为它要求您在关键点上添加许多“检查”,这些关键点可能会使函数在执行过程中花费的时间过长。
这是假设您处于同步环境中
函数发生器不是一个完美的解决方案,但它是一个更好的解决方案。
它需要对原始功能进行两个易于理解的修改。
*
到您的函数名称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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句