在节点js中设置超时的麻烦

我有一个域exception处理程序(夜间testing包装)。

我的exception处理程序包装

var domainError = function(func) { return function() { var d = domain.create().on('error', function(err) { console.error(err.stack); }); d.enter(); try { return func.apply(this, arguments); } catch (err) { //do something with the err } d.exit(); } }; 

我想设置超时,以便return func.apply(this, arguments); 并不是永远。

任何人都可以build议如何添加超时,并使域结束function,并退出,如果超过超时?

在Node的并发模型中这是不可能的。 没有“中断” – 多处理是合作完成的。 如果你从另一面来看,你会得到一个非常有力的保证,你的代码将几乎总是运行完成。

你可以产生另一个subprocess,然后抢占(因为进程支持抢占)。


终止一个同步函数最简单的方法就是在自己的“隔离”中执行 – 意味着它可以被杀死。 请注意,这不是像制作一个专门的工作人员“进程”和使用asynchronousIO进行通信 – 这可能更快 – 但这更容易。

 var vm = require('vm'); // get the VM module // when you want to run a bit function withError(func, context, timeout){ var ctx = vm.createContext(context); var code = func.toString().slice(12).slice(0,-2) return vm.runInContext(code, ctx, { timeout: timeout, displayErrors: true; // to log, like in your version }); } 

请注意,这段代码意味着函数不能访问闭包范围或参数 ,所以一切都需要在它的范围之内 – 它并不像你想的那么大,因为你可以转换:

 function doFoo(x, y){ return x + y + z; // z is from closure } 

 function doFoo(){ return this.x + this.y + this.z; } 

并称之为

 withError(doFoo, {x:x, y:y, z:z }, 2000); // 2000 ms timeout 

这也可以通过使用生成语法树的词法分析工具来更好地自动化。

如果我可以build议一个替代scheme – 以可以控制的方式编写你的func – 在这种情况下,合作的多任务处理更容易,也更不容易出错。

或者使用npm -install timer-stopwatch

计时器秒表

酷?