2012-11-29 91 views
2

在繼承EventEmitter的類中,我們通常有兩個點來處理錯誤。處理來自EventEmitter的錯誤

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

我們不知道,哪裏出現錯誤,什麼樣的回調會執行。 例如,tedious(MS SQL Server的模塊):

  • 密碼不正確:兩個回調
  • 不正確的數據庫名稱:僅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*/ 
    } 
} 

當然,如果出現任何錯誤,我只想執行一次回調。我該怎麼做?如何正確地結合兩個錯誤處理點之一?也許如果在我的課上我使用繼承EventEmmiter的類,我還需要從EventEmitter獲取我的類。

回答

1

如果你想避免一遍又一遍地運行相同的事件處理程序使用once事件綁定。鑑於您的代碼示例,我不相信onceon的行爲有什麼不同,因爲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(); 
    } 
}