2

在继承 EventEmitter 的类中,我们通常有两个点来处理错误。

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

我们不知道错误会出现在哪里,以及会执行什么回调。例如,乏味(MS SQL Server 的模块):

  • 密码错误:两个回调
  • 不正确的数据库名称:仅eventEmitterCallbacksomeAsyncAction执行没有错误
  • 不正确的主机:仅someAsyncAction
  • 主机IP格式不正确(例如1234.10.0.1):node.js刚刚关闭,没有任何错误:)

我想创建一个简单的函数,它将模块中的所有错误委托给回调的第一个参数。

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

当然,如果有任何错误原因,我只想执行一次回调。我该怎么做呢?如何正确地将两点错误处理合二为一?也许如果在我的类中我使用继承 EventEmiter 的类,我也需要从 EventEmitter 继承我的类。

4

1 回答 1

1

once如果您想避免反复运行相同的事件处理程序,请使用事件绑定。鉴于您的代码示例,我不相信once并且on会表现出任何不同,因为该connection对象不是长期存在的,但它更清楚地传达了意图。然后使用闭包范围标志来避免事件处理程序和回调响应相同的底层错误。

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();
    }
}
于 2012-11-29T01:23:31.393 回答