在我的Node.js应用程序中,我需要某种机制来停止函数调用,如果调用时间过长。
function testIt() { ... }
runFunctionOnlyFor(1000, testIt, function (err) {
if (err) console.log('function call timed out');
else console.log('function call completed successfully');
});
现在,当然runFuncOnlyFor
的实现是未知的(对我来说)。有什么建议如何实施?
3条答案
按热度按时间4uqofj5v1#
我看到了一些问题。
1)通常不应该在Node中编写阻塞代码。JS,即使它是“只有”1秒。如果这是一个具有许多客户端的Web服务,则阻塞一秒钟可能会对性能产生破坏性影响。
2)从Node开始。JS实际上是单线程的,我真的没有看到任何简单的方法来在一定时间后取消执行,除非计时是由
testit
本身完成的,因为你需要一个单独的线程来运行中止第一个线程中运行的函数的函数。一种更好的方法可能是使
testit
函数异步化,并将其分解为几个步骤,并通过中间上下文切换,并定期检查runFunctionOnlyFor
在所需持续时间的计时器到期时可以设置的标志或类似物。另一种方法是使用child process,如果这适合您的目的。
oipij1gg2#
你可以通过创建一个代理函数来实现:
1-将旧函数存储在变量中
2-创建一个新函数,用参数中的值设置超时,并在超时后抛出错误。
示例:
sxpgvts33#
你可以用承诺做到。种族
在promise中添加你的长执行函数,并让它为p1;
创建一个promise,在你想要的最大持续时间上超时;
例如,该承诺将在500个米尔斯之后返回
使用Promise。收集第一完成承诺的竞赛
如果承诺P1花费超过500个米尔斯来完成,则结果将来自承诺P2,并且P1将被立即取消。