2017-04-07 264 views
0

我創建了下面的方法來幫助我找到一個項目,並更新這樣的具有一定價值的另一個對象屬性:異步類型錯誤:CB是不是一個函數

mergeAinBbyAttr: function(a, b, attr, val, cb) { 
    async.forEach(a, function(itemA, cb) { 
     async.forEach(b, function(itemB, cb) { 
      if (itemA[attr] == itemB[attr]) { 
       itemB[val] = itemA[val]; 
      } 
      cb(null, itemB); 
      }, 
      function(e, result) { 
      cb(e, result); 
      }); 
     }, 
     function(e, result) { 
     cb(e, result); 
     }); 
    } 

的問題是,我得到:

TypeError: cb is not a function

在最後cb(e, result);。我不得不承認我有點腦殘,答案肯定是簡單的。

謝謝!

回答

1

不能保證cb是一個函數。有人可以通過他們想要的或者什麼都不通過(在這種情況下,cb將是undefined)。

如果您認爲您調用此函數的代碼是cb保證是一個函數,那麼可以在mergeAinBbyAttr的開頭添加一個assert(typeof cb === 'function');。 (您可能需要在你的文件的頂部添加const assert = require('assert');。)

如果這是庫代碼,別人也可以打電話或者如果你,否則不能保證接收功能cb,添加一些類型檢查:

if (typeof cb !== 'function') { 
    // Do something here: Throw an error, set `cb` to a no-op function, whatever 
} 
+0

我看到發生了什麼,我用.exec而不是函數()(即回調)調用它......感謝你的回答讓我以正確的方式! – galgo

相關問題