1

次の関数シグネチャがあります。

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

パラメータをオーバーライドしてuse_redisfalse にできると思いますが、試したことはすべてまだ機能していません。onCompleteコールバックをインラインで定義している場合、これは可能ですか? これは、関数への私の呼び出しがどのように見えるかです:

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

いくつかの異なる方法を追加しようとしましfalseたが、何も機能しません。コールバック関数を別の場所で定義してから、オーバーライドするためにインラインで定義するのではなく、それを参照する必要がありますuse_redisか?

4

2 に答える 2

2

そのように動作するはずです:

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

最初のパラメーターは ID、2 番目はコールバック関数、3 番目は use_redis を false に設定します

編集 - APIを変更するための私の解決策:

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

この関数を呼び出すときは、コールバックを常に 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()
于 2013-01-02T18:20:38.513 に答える
2

通常、コールバックを最後の引数にする必要があります。そうしないと、構文が不安定になるためです。

では、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
于 2013-01-02T18:20:40.433 に答える