2016-11-16 86 views
2

在某些庫/框架文檔中,它告訴您可以使用同步或異步函數。檢查函數是否使用回調或返回值

例如,在Mongoose documentation它說:

定製的校驗器也可以是異步的。如果你的驗證器函數有兩個參數,貓鼬會假設第二個參數是一個回調函數。

因此,基本上,當你像這樣定義一個函數:

function(a){ 
    return false; 
} 

貓鼬會認爲它是同步的,但我們把它定義是這樣的:

function(a,callback){ 
    setTimeout(function(){ 
     callback(false); 
    },5000) 
} 

這將被視爲異步碼。

我發現同樣的事情Mocha testing framework,該文檔中說:

測試與摩卡異步代碼不能簡單!只需在測試完成時調用回調。通過向它()添加一個回調函數(通常名爲done),Mocha會知道它應該等待這個函數被調用來完成測試。


我的問題是:他們是如何做到這一點?當你調用函數時,你會如何知道它是否需要1或2個參數?

回答

6

你只檢查參數

function something(arg1, arg2) { 
 
    if (typeof arg2 === 'function') { 
 
     console.log(arg1 + ' has callback'); 
 
    } else { 
 
     console.log(arg1 + ' does not have callback'); 
 
    } 
 
} 
 

 
something('call 1'); // no callback 
 

 
something('call 2', function() {}); // has callback

要檢查有多少個參數的函數期待,你會使用Function.length

length是一個屬性的函數對象,並指出函數的參數有多少個 預計,即形式參數的數量。 該編號排除了其餘參數,僅在第一個參數之前包含參數 並使用默認值。相比之下, arguments.length對於一個函數是本地的,並提供實際傳遞給該函數的 參數的數量。

console.log((function()  {}).length); /* 0 */ 
 
console.log((function(a)  {}).length); /* 1 */ 
 
console.log((function(a, b) {}).length); /* 2 etc. */

+0

@adeneo你不能變成功能 – Mahi

4

他們是如何做到這一點?當你調用函數時,你會如何知道它是否需要1或2個參數?

你可以使用functionname.length來解決這個問題。

function some(a,b,c){ 
    return false; 
} 

function somethingElse(a){ 
    return false; 
} 

some.length //returns 3. 
somethingElse.length //returns 1. 
0

var func= function(a,b){ 
 

 
} 
 
console.log(func.length);