node.js - 处理NodeJS错误事件?

标签 node.js error-handling event-handling

我有一个工作器类,它具有许多不同的实用程序方法,并且在执行中的任何地方出现问题时都发出error消息。由于NodeJS的魔力,error消息很特殊,如果没有人在听它们,它们会变成抛出错误,所以我目前这样做:

var myWorkerFunction = function(input) {
  var w = myFactory();
  try {
    w.dothis();
    w.dothat(input);
    w.hokeypokey();
    return w.finalize();
  } catch(e) {
    return false;
  }
}

我想知道的是,是否有可能完全避免try/catch块? NodeJS的文档似乎表明最好避免不要重新引发捕获的异常(我在这里没有做任何检查,以查看引发异常的真正原因是我的工作人员的逻辑,而不是Node的严重错误)。

所以我想做类似的事情:
var myWorkerFunction = function(input) {
  var w = myFactory();
  w.on('error', function() {
    // How to tell caller of myWorkerFunction() I failed, 
    //   and stop the rest of the myWorkerFunction function? (return false)
  });
  w.dothis();
  w.dothat(input);
  w.hokeypokey();
  return w.finalize();
}

但是,如何在该事件侦听器函数中触发myWorkerFunction的“返回”呢?我也可以让myWorkerFunction发出“错误”消息,但这只会将 jar 踢到下一层,并且不会停止执行工作程序脚本(即,如果dothis()失败,请不要继续操作并调用dothat(input))。是否有针对这种情况的编程模式?

编辑:我可以想出的一个解决方案是这样的:
var myWorkerFunction = function(input) {
  var w = myFactory();
  var hasFailed = false;
  w.on('error', function() {
    hasFailed = true;
  });
  w.dothis();
  if (hasFailed) return fa;se
  w.dothat(input);
  if (hasFailed) return false;
  w.hokeypokey();
  if (hasFailed) return false;
  var out = w.finalize();
  if (hasFailed) return false;
  return out;
}

必须在每行代码之前不断检查我们是否失败了,这不是很优雅。

最佳答案

有一些想法。首先,您可能想看看Caolan McMahon的精美async nodejs library,因为您好像正在重新发明使用“async.waterfall”可以很好处理的流控制。

如果您觉得不合适,那么按照您采用的模式,您可以选择在完成每个步骤后发布事件(请参见下面的示例中的“完成”事件)。这将使您能够侦听那些事件,以指示未发生任何错误,并且继续进行下一步是有意义的。让“最终确定”出现一个可选错误,以使您的工作人员能够区分正常完成与异常完成。这未经测试,但是类似的东西可能看起来像这样:

var myWorkerFunction = function(input) {
  var w = myFactory();
  w.on('error', function(error) {
    // Handle error, log whatever - and finalize with an error?
    w.finalize(error);
  });
  w.on('doneWithThis', function() {
    w.dothat(input);
  });
  w.on('doneWithThat', function() {
    w.hokeypokey();
  });
  w.on('doneWithHokeypokey', function() {
    w.finalize();
  });

  w.dothis(); //starts the ball rolling.
}

关于node.js - 处理NodeJS错误事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124420/

相关文章:

javascript - Node.js 无阻塞地写入数组

json - 合并目录nodejs中的所有json文件

haskell - 区分Haskell中的错误

ruby-on-rails - 在关联资源中使用/form_for处理错误

java - 如何停止这个 java.lang.ArrayIndexOutOfBoundsException?

node.js - 找不到模块 : Error: Cannot resolve module 'react-addons-test-utils'

javascript - 在 Dialogflow v2 中使用 Node.js Webhook 自定义快速回复

Android:在 RelativeLayout 的 onTouchEvent 中看不到 ACTION_MOVE/UP

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

winforms - 获取 parent 姓名