如何覆盖参数的默认值?

我有以下function签名:

question: (question_id, onComplete, use_redis = true) -> 

我假设我可以覆盖use_redis参数为false,但我所尝试的一切还没有奏效。 这是可能的,如果我定义我的onCompletecallback内联? 这就是我对函数的调用:

 Summaryresults.question 1, (summary) -> answer_data.summary = summary done() 

我试过添加几个不同的方法,但没有任何工作。 我是否需要在其他地方定义我的callback函数,然后引用它,而不是定义它内联,以覆盖use_redis

应该这样工作:

 Summaryresults.question 1, (summary) -> answer_data.summary = summary done() , false 

第一个参数是id,第二个是你的callback函数,第三个设置use_redis为false

编辑 – 我的解决scheme,以改变API:

 question: (id, options...) -> [use_redis, onComplete] = options if typeof use_redis is "function" onComplete = options use_redis = true 

在调用这个函数时,你应该总是把你的callback函数作为LAST参数:

没有use_redis-param:

 Summaryresults.question 1, (summary) -> answer_data.summary = summary done() 

用use_redis-param:

 Summaryresults.question 1, false, (summary) -> answer_data.summary = summary done() 

通常情况下,您希望callback是最后一个参数,否则语法会变得不稳定。

那么为什么不改变你的API呢?

 question: (question_id, options = {}) -> onComplete = options.onComplete useRedis = options.useRedis ? true # ... Summaryresults.question 1, useRedis: false onComplete: -> answer_data.summary = summary done() 

看看有多可读性呢?


但是,这就是说,你可以在正确的位置用一个时髦的逗号来调用

 Summaryresults.question 1, (summary) -> answer_data.summary = summary done() , false 

编译为:

 Summaryresults.question(1, function(summary) { answer_data.summary = summary; return done(); }, false); 

也许

 hollaback = (summary) -> answer_data.summary = summary done() Summaryresults.question 1, hollaback, false