停止从外部封闭函数执行?

我想运行一些预定的工作。 这些工作可能需要很长时间,我想给他们一个暂停。 当一个function已经运行了60秒,然后立即停止exectuion函数和所有来自这个函数的调用。

var x = function (){ /* doing something for eventually a looong time */ } x.kill() 

这可能吗?

因为node.js本身是单线程的,所以x()之外的其他代码将不会运行,直到x()返回。 所以,你不能从概念上做你正在试图做什么与一个同步运行的单一function。

有一些库可以添加某种可以使用的线程(有特殊限制)。 你可以看到这个post,了解更多有关这些选项的细节: 如何在nodejs中创build线程

如果你向我们展示了代码在x()里面做了什么,那么我们可以给你一些关于如何重构代码来实现你的目标的想法。 如果它具有asynchronous操作(或者可以转换为使用asynchronous操作),则x()将返回,其他代码可以运行,而node.js正在等待这些asynchronous操作执行它们的操作,并且可以向那些asynchronous操作他们应该停止做他们的事情。 但是,大部分时间将不得不等待asynchronous操作才能使该scheme起作用。

如果你可以把x()代码移动到一个单独的进程中,那么你可以启动一个subprocess,给它运行x()代码,然后杀死整个节点subprocess,如果它没有完成一定的时间。 这显然是处理这个函数调用的一个重量级的方法,但它确实能够让你在需要的时候杀死整个环境。 如果从安全或隐私的angular度来看,它也提供了进程隔离。

如果你正在使用Node.js,你可能会考虑使用child_process来进行asynchronous函数调用,如果在一段时间内没有完成,你可以稍后终止它。

但是这种方法需要你将function x分离到另一个JS文件,比如说modulex.js ,它实现了:

 function x(){ // do whatever } x(); 

而在你的main.js (或者你给它的任何名字),你想在那个asynchronous开始在这个modulex.js中运行function x稍后终止的时候,你可以通过child_process来调用它,这是Node的一个内置特性之一.js文件:

 var spawn = require('child_process').spawn; var x = spawn('node modulex.js'); // give any particular arguments if required x.stdout.on('data', function (data) { // event handler when function x finishes! // data = any output printed by modulex.js }); x.stderr.on('data', function (data) { // event handler when function x fails! // data = any error printed by modulex.js }); // Or kill the `x` after a timeout with this: function timeout(){ x.kill(); } 

这种方法将需要您稍微重新devise节点应用程序的体系结构。 但是,这将更有效地处理单线程JavaScript。

我build议在开始之前阅读node.js上的child_process官方文档: https : //nodejs.org/api/child_process.html