2

EventEmitterを継承するクラスでは、通常、エラーを処理するための2つのポイントがあります。

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

エラーが発生する可能性のある場所と、実行されるコールバックはわかりません。たとえば、面倒です(MS SQL Serverのモジュール):

  • パスワードが正しくありません:両方のコールバック
  • 不正なデータベース名:のみeventEmitterCallback; someAsyncActionエラーなしで実行
  • 不正なホスト:のみ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*/
    }
}

もちろん、エラーの原因があれば、コールバックを1回だけ実行したいのですが、どうすればよいですか?2つのエラー処理ポイントを1つにどの程度正しく結合しますか?たぶん、私のクラスでEventEmmiterを継承するクラスを使用する場合、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 に答える