5 秒后停止运行未知函数

Chi*_*iko 0 javascript node.js

假设我有一个函数someFunction(),我无法控制它的内部内容。我希望运行这个函数不超过 5 秒。

我尝试过使用 asetTimeoutsetInterval这样的:

try {
   const timeoutId = setTimeout(() => {
      throw new Error("Time over");
   }, 5000);

   someFunction();
   clearTimeout(timeoutId);
} catch (e) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

问题在于,如果存在无限循环,someFunction()则永远不会调用超时。

解决这个问题最简单的方法是什么?我考虑过使用工作线程,但在我的情况下将参数传递给另一个线程是有问题的。

多谢!

T.J*_*der 6

\n

解决这个问题最简单的方法是什么?

\n
\n

在同一执行环境中,您不能这样做。如果您不控制函数内部的内容,则无法从代码中阻止它。当您拨打电话后someFunction,您的代码就不会重新获得控制权,直到该函数运行完成为止。\xc2\xb9 如果它无限循环,则它会无限循环。

\n

可以生成一个工作线程子进程,在单独的环境中运行该函数,然后您可以终止它(1 , 2在一段时间后但在你的主要环境中,你无法做到这一点。

\n
\n

\xc2\xb9 请注意,在函数的情况下async,“运行到完成”意味着“到达返回其承诺的点”(第一个awaitreturn[隐式或显式],或未捕获的错误)。因此,从理论上讲,如果您有一个async函数启动了某件事,那么直到第一个函数之后才进入有限循环await,您的代码将有机会运行,但如果您无法控制该函数的代码中,您无法阻止它再次继续(除了运行您自己的无限循环,这当然是您不想做的)。

\n