2

たとえば、次のコードを使用します。

getThing = (thing_id, cb_success, cb_error)  ->
  model.findById thing_id, 
    (error, thing) ->
      if error || !thing 
        cb_error "error" 
      else
        cb_success thing

そして、関数を呼び出す

getThing thing_id
, (thing) ->
  console.log "Found a thing!"
, (error) 
  console.log" Uh oh..."

複数のコールバックを渡している場合、どれも呼び出されることが保証されていません。この場合、どのように await/defer を構造化できますか? それとも、単一のコールバックのみを提供するようにコードを完全に再考し、その中のエラーの存在を評価する必要がありますか?

4

2 に答える 2

0

両方から終了などの中間関数を呼び出してから、await/defer ブロックでこの新しいラッパー関数を呼び出すことができます。

https://gist.github.com/maxtaco/2683cbc3379a95b6703f

于 2014-07-22T02:15:28.733 に答える
0

Iced CoffeeScript は、継続として使用する単一のコールバックを想定しています。場合によっては、慣れ親しんだコールバックを使用する方が理にかなっています。

  • 1 つのコールバックが常に 1 回呼び出される場合は、それらをマージして使用しますawait

  • コールバックが 0 回または複数回呼び出される可能性がある場合は、使用しないでくださいawait— 代わりにコールバック関数を渡します。

たとえば、Node.js の非同期ファイルシステム APIawaitは、続行する前に値を返す必要があるため、 の優れた候補です。

await fs.stat somePath, defer(err, stats)

...しかし、コールバックが複数回呼び出される可能性がある HTTP サーバーは、通常のコールバックでなければなりません。

http.createServer (req, res) ->
   # handle the request

あなたの場合、Iced CoffeeScript を使用する場合は、メソッドが単一のコールバックを受け取るように再構築する方が理にかなっています。

于 2014-10-18T22:24:23.223 に答える