2014-01-09 25 views
7

我想要做的是使回調參數可選的功能。如果通過回調,則將值發送給回調函數,否則只返回值。如果我省略回調,則返回undefined。執行回調(OBJ)如果回調存在否則返回對象

getByUsername = function(user_name, cb){ 
    async.waterfall([ 
     //Acquire SQL connection from pool 
     function(callback){ 
      sql_pool.acquire(function(err, connection){ 
       callback(err, connection); 
      }); 
     }, 
     //Verify credentials against database 
     function(connection, callback){ 
      var sql = 'SELECT * FROM ?? WHERE ?? = ?'; 
      var inserts = ['users','user_name', user_name]; 
      sql = mysql.format(sql,inserts); 
      connection.query(sql, function(err, results) { 
       sql_pool.release(connection); 
       callback(err, results); 
      }); 
     }, 
     //Create user object 
     function(results, callback) { 
      if(results.length < 1){ 
       if(cb){ 
        cb(null); 
       } else { 
        return null; 
       } 
      }else { 
       var thisUser = new User(results[0]); 
       if(cb){ 
        cb(thisUser); 
       } else { 
        return thisUser; 
       } 
      } 
     }], function (err, results) { 
      throw new Error('errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrroooooorrrrrrrr'); 
     } 
    ) 
} 
+3

那麼,有什麼問題嗎? –

+0

哈哈。抱歉。它不能正常工作。我沒有定義回調。 –

+1

它應該有點顯而易見。看看參數的名稱。另外,如果它爲空則爲什麼要調用回調函數? –

回答

16

你可以簡單這樣的:

if(cb && typeof cb === "function") { 
    cb(num + 1); 
} 

注意:請您在實際使用cb打電話給你的回調函數,並確保不callback;)

+3

'&& typeof cb ===「function」)'如果你想仔細檢查類型安全 – zero298

+0

謝謝zero298。我補充說這個條件。順便說一句,不需要'===',因爲'typeof'運算符總是「返回」字符串,或者是null,所以簡單的比較「'function」'就可以。 – Floremin

+0

謝謝!我一定會將這些建議用到我的代碼中。我更新了我的例子作爲我的實際代碼,因爲我之前的例子很好,是一個失敗(吸取了教訓)。在解決了我的錯誤之後,我能夠讓前面的例子工作,但是我不能也不容易看到我的錯誤。再次感謝! –