处理来自EventEmitter的错误

在inheritanceEventEmitter的类中,我们通常有两点来处理错误。

someClass.on('error', function eventEmitterCallback(err){/* handle error*/}); //and someClass.someAsyncAction(function asyncActionCallback(err){/* handle error*/}) 

我们不知道,哪里出现错误,什么callback将执行。 例如, 繁琐的 (MS SQL Server模块):

  • 不正确的密码:两个callback
  • 不正确的数据库名称:只有eventEmitterCallback ; someAsyncAction执行没有错误
  • 不正确的主机:只有someAsyncAction
  • 正确的主机IP格式(例如1234.10.0.1 ):node.js只是没有任何错误:)

我想创build一个简单的函数,将从模块到callback的第一个参数的所有错误。

 function getSomeStuffFromDb(callback) { var connection = new dbConnection(options); connection.on('error', callback); connection.connect(function(err) { if (err) return callback(err); /*exec SQL query*/ } } 

当然,如果出现任何错误,我只想执行一次callback。我可以怎么做? 如何正确地结合两个error handling点之一? 也许如果在我的课上我使用inheritanceEventEmmiter的类,我也需要从EventEmitter获取我的类。

如果您想避免一遍又一遍运行相同的事件处理程序,请使用once事件绑定。 考虑到你的代码示例,我不相信once会有任何不同的行为,因为connection对象不是很长寿,但它更清楚地传达了触摸的意图。 然后使用闭包范围标志来避免事件处理程序和callback响应相同的基础错误。

 function getSomeStuffFromDb(callback) { var handled = false; var connection = new dbConnection(options); connection.once('error', function (err) { if (err && !handled) { handled = true; return callback(err); } }); connection.connect(function(err) { if (err) { if (handled) { return; } else { handled = true; return callback(err); } } /*exec SQL query*/ callback(); } }