检查函数是使用回调还是返回值

时间:2016-11-16 11:46:00

标签: javascript callback

在某些库/框架文档中,它告诉您可以使用同步或异步函数。

例如,在Mongoose documentation中说:

  

自定义验证器也可以是异步的。如果验证器函数有2个参数,mongoose将假设第二个参数是回调。

所以基本上定义一个这样的函数:

function(a){
    return false;
}

Mongoose会将其视为同步,但我们将其定义为:

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

它将被视为异步代码。

我注意到Mocha testing framework的相同内容,在文档中说:

  

使用Mocha测试异步代码并不简单!只需在测试完成后调用回调。通过向它()添加回调(通常名为done),Mocha将知道它应该等待调用此函数来完成测试。

我的问题是:他们是如何做到的?你怎么知道在调用函数时是否需要1或2个参数?

3 个答案:

答案 0 :(得分: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是函数对象的属性,表示有多少个属性   函数期望的参数,即形式参数的数量。   此数字不包括rest参数,仅包含参数   在第一个具有默认值之前。相比之下,   arguments.length是函数的本地,并提供了数量   参数实际传递给函数。

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

答案 1 :(得分: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.

答案 2 :(得分:0)



var func= function(a,b){

}
console.log(func.length);