【问题标题】:Trouble setting timeout in node js无法在节点 js 中设置超时
【发布时间】:2015-04-16 10:52:07
【问题描述】:

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

我的异常处理程序包装器

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); 不会永远占用。

如果超过超时,谁能建议我如何添加超时并让域结束函数并退出?

【问题讨论】:

  • 该函数是否同步工作?
  • 是的。 domainerror 函数同步工作..@MustafaDokumacı

标签: javascript node.js exception-handling settimeout


【解决方案1】:

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

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


终止同步函数的最简单方法是在它自己的“隔离”中执行它——这意味着它可以被杀死。请注意,这不如创建一个专门的工作“进程”并使用异步 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 - 在这些情况下,协作式多任务处理会更容易且不易出错。

【讨论】:

    【解决方案2】:

    否则 使用 npm -install timer-stopwatch

    timer stopwatch

    酷吗??

    【讨论】:

    • 我认为您没有理解问题所在。这与任何这些都无关,这是关于服务器端 JavaScript 和停止同步代码...
    • 显然答案没有解决问题。
    • node.js 是否是服务器端的,源代码是否“类似于”javascript 并使用与客户端相同的范例?
    • 不,事件的工作方式与 DOM 不同(没有 preventDefault 等),也没有 jQuery……即使它们的工作方式相同 - 这仍然无关紧要。
    • 这是一个同步调用...是你所期望的吗??但是,我知道上面的代码 on("error") 类似于 C#.NET 中的委托。对于 c# 中的委托,您可以编写以下内容: a.Error += func_error;因此, a.Error -= func_error 用于删除委托;为防止重新运行该函数并添加两次相同的 func_error,您应该首先删除旧的委托调用。 C#委托是同步调用;甚至,jQuery 范例也是同步调用。怎么了?
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多