在节点js中设置超时故障

时间:2015-04-16 10:52:08

标签: javascript node.js exception-handling settimeout

我有一个域异常处理程序(用于夜间测试的包装器)。

我的异常处理程序包装

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);不会永远消失。

有人可以建议我如何添加超时并使域结束该功能并退出,如果超过超时?

2 个答案:

答案 0 :(得分:7)

这在Node的并发模型中是不可能的。没有“中断” - 多处理是协同完成的。如果你从另一边看它 - 你会得到一个非常有力的保证,你的代码几乎总是会完成。

您可以生成另一个子进程,然后抢占它(因为进程支持抢占)。


终止同步函数的最简单的方法是在它自己的“isolate”中执行它 - 这意味着它可以被杀死。请注意,这不像制作专用工作人员“进程”并使用async io与之通信那样高效 - 这可能更快 - 但这更容易。

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

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

如果我可以提出替代方案 - 以可以控制的方式编写func - 在这些情况下,协作式多任务处理更容易,更不容易出错。

答案 1 :(得分:-2)

或者 使用npm -install timer-stopwatch

timer stopwatch

很酷??