2012-11-29 4 views
2

EventEmitter를 상속하는 클래스에는 일반적으로 오류를 처리하는 두 개의 점이 있습니다.EventEmitter의 오류 처리

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

어디서 오류가 발생하고 어떤 콜백이 실행되는지 알 수 없습니다. 예를 들어 , tedious (MS SQL 서버 모듈) :

  • 잘못된 암호 : 모두 콜백
  • 잘못된 데이터베이스 이름 : 만 eventEmitterCallback; someAsyncAction 오류없이
  • 잘못된 호스트를 실행합니다에만 someAsyncAction
  • 호스트의
  • Icorrect 형식 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 클래스에서 상속 받아야합니다.

답변

1

동일한 이벤트 핸들러를 반복해서 실행하지 않으려면 once 이벤트 바인딩을 사용하십시오. 귀하의 코드 샘플을 감안할 때 connection 객체가 수명이 길기 때문에 onceon이 다르게 동작 할 것이라고 생각하지 않지만 터치를 더 명확하게 전달합니다. 그런 다음 closure-scope 플래그를 사용하여 동일한 기본 오류에 응답하는 이벤트 핸들러와 콜백을 피하십시오.

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(); 
    } 
}