0

要点に行きましょう。私はCSが大好きで、ノードが大好きで、神々が提案したようにコールバックを使用しても問題ありません。

残念ながら、私は通常、わずかにネストされたコールバックのエラーを常にチェックすることになります。

以下は、同じサンプル タスクを実行するための 3 つの異なるスタイルです。インデントを回避し、地獄を条件付け、同時に読みやすさを犠牲にしないために使用するものはどれですか?

promises、async、iced-cs を使用していない場合は、新しいものを提案してください。

authenticate: (token, cb) =>
  @collection 'services', (err, collection) =>
    if err
      cb err, undefined
    else
      collection.findOne token: token, (errFindingService, service) =>
        if err
          cb errFindingService, undefined
        else
          cb undefined, service

authenticate: (token, cb) =>
  @collection 'services', (err, collection) =>
    if not err
      collection.findOne token: token, (errFindingService, service) =>
        if not errFindingService
          cb undefined, service
        else
          cb errFindingService, undefined
    else
      cb err, undefined

authenticate: (token, cb) =>
  @collection 'services', (err, collection) =>
    return cb err, undefined if err
    collection.findOne token: token, (errFindingService, service) =>
      return cb errFindingService, undefined if err
      cb undefined, service

PS: https://github.com/polarmobile/coffeescript-style-guideに準拠するif not err代わりに、私が使用している2番目のものunless

よろしくお願いします。^_^

4

3 に答える 3

0

最初のものは、モジュール nodejs内など、内部で使用するものに近いものです。fs

errは最初の引数なので、最初に確認するのが理にかなっています。邪魔にならないようにすると、コールバック スタックの奥深くまで「ドリルダウン」します。

最初と 3 番目のオプションは、明示的な return を除いて、同じ JS にコンパイルされます。

どちらが読みやすく、重要な部分を識別しやすいですか? 数か月後にコードを見直すことを考えてみてください。

Python のバックグラウンドを持つ私は、よりコンパクトな形式がより明確でない限り、よりオープンな構造 (最初の構造など) を使用することを好みます。したがって、Coffeescript の内包表記は好きですが、可能なすべての{}andを省略した式にはあまり興味がありません()。立ち止まって頭の中でそれらを追加しなければならない場合、簡潔さが行き過ぎています。

于 2013-08-25T22:06:36.860 に答える
0

フラットフローを使用すると、次のようになります。

{ flow } = require 'flat-flow' 

authenticate: (token, done) ->
  flow { getCollection: @collection }, [

    # Get collection.
    (done) ->
      @getCollection 'services', (err, collection) ->
        done err, { collection }

    # Get service
    (done) ->
      @collection.findOne { token }, (err, service) ->
        done err, { service }

    # # Get service (alternative)
    # (done, { collection }) ->
    #   collection.findOne { token }, (err, service) ->
    #     done err, { service }

  ], (err, { service }) ->
    done err, service

    # You can use @service as well.

長い呼び出しチェーン (条件の有無にかかわらず) でもクリーンです。

于 2015-02-02T14:03:58.153 に答える