0

CoffeeScript クラス内に次の関数があります。

 use: (db, fn) ->
    fs.exists db, (exists) =>
      if exists?
        @db = db
        @_fetch()
      else
        fs.writeFile db, {}, (err) =>
          if err 
            err
          else 
            @db = db
            @_fetch()

私を悩ませているのは、私が1回@db = db@_fetch()2回書かなければならなかったことです。私がこれをしなければならなかった理由は、else句がfs.writeFilewhich を非同期で呼び出すためです。したがって、これらの 2 行をwriteFileのコールバック内に配置して、すぐに起動しないようにする必要がありました。

ただし、これをクリーンアップしてそれらの行を書き込む方法はありますか? 現時点では 2 行しかありませんが、コールバックが 10 行存在するとどうなるでしょうか。ぐちゃぐちゃになりませんか?

この小さなコードに関するその他のフィードバックも歓迎します。エラー処理についてはよくわかりません(ただ今戻っerrてきたところです..)。

4

3 に答える 3

1

CoffeeScript には関数があり=>、関数をインスタンスにバインドできるので、コードをバインドされた関数に分割してみませんか?

use: (db, fn) ->
  fetch = =>
    @db = db
    @_fetch()
  fs.exists db, (exists) =>
    if exists?
      fetch()
    else
      fs.writeFile db, {}, (err) =>
        if err 
          err
        else 
          fetch()

fn次に、他に行う必要があること( の呼び出しなど) を に追加しfetchます。

また、私はあなたのことを考えていません:

if err
  err

エラー処理は何でもします。私はnode.jsの専門家ではありませんが、私の知る限り、writeFileコールバックが何を返すかは気にしません。

于 2013-08-04T18:05:04.657 に答える
0

DB をロードしてフェッチしたくないのは、DB が存在せず、その後のロードでエラーが発生した場合のみなので、次のようなことを試すことができます...

use: (db, fn) ->
    fs.exists db, (exists) =>
    if not exists?
        fs.writeFile db, {}, (err) =>
            if err 
                return err

    @db = db
    @_fetch()
于 2013-08-04T18:10:45.593 に答える