12

返す値を延期した関数を実装しています。関数内には、ネストされた条件式が多数あります。

例えば:

deferred = Q.defer()
FS.readFile("foo.txt", "utf-8", (error, text) ->
    if error
      deferred.reject(new Error(error))
    else
      deferred.resolve(text)
)
return deferred.promise

コンパイルされるよりも:

var deferred;

deferred = Q.defer();

FS.readFile("foo.txt", "utf-8", function(error, text) {
  if (error) {
    --> return <-- deferred.reject(new Error(error));
  } else {
    --> return <-- deferred.resolve(text);
  }
});

return deferred.promise;

最後の戻り値だけが必要ですが、if / elseの戻り値は必要ありません(つまり、コンパイルされたコードでは-> return <- )

CoffeeScriptコンパイラのこのような動作(不要な場合は暗黙的に返される)を回避するにはどうすればよいですか?

4

3 に答える 3

12

Coffeescriptは最後の式の結果を自動的に返すため、その結果を返さないようにする場合は、if別の式を追加する必要があります。この場合、を追加するだけreturnです。

FS.readFile "foo.txt", "utf-8", (error, text) ->
  if error
    deferred.reject new Error(error)
  else
    deferred.resolve text
  return

また、errorはすでにErrorオブジェクトなので、直接拒否することができます。

deferred.reject(error)
于 2013-03-18T04:07:54.540 に答える
2

正確にはできません。不要な場合は無視するか(これが最も一般的な方法です)、関数の最後にステートメントを追加して明示的な代替手段を提供することができます。コードベースでこれを常に実行しようとすると、勝てない言語との戦いになります。したがって、個人的な推奨事項は、アシュケナス氏の暗黙の復帰を受け入れて、陽気な道を進むことです。

fs.readFile "foo.txt", "utf-8", (error, text) ->

  # postfix style if statement here avoids the else
  # of course, the value returned you may not like, so 
  # you probably won't use this style, but my boilerplate for
  # error handling is
  # return callback(error) if error

  return deferred.reject(new Error(error)) if error
  deferred.resolve(text)

  # Here you can add an explicit return like
  return

  # or some other expression
  null

  # or 'this' in cases where chainability might be nice
  this

  # or so you don't accidentally delete this statement later thinking it is
  # useless
  return null

これらのフォームはどれでも機能しますが、実際にはこれらは一般的には見られません

于 2013-03-18T04:12:21.147 に答える
0

私はいつもこのようにします:

f = ->
  deferred = Q.defer()
  FS.readFile ..., ( error, text ) ->
    return deferred.reject error if error?
    deferred.resolve text
  return deferred.promise

1つ目returnは、値を返すのではなく、実行を停止するためです。

returnコールバックの最後の行から、JSに追加の(そして無意味な)ものがまだあります。それを避けるために、追加を挿入しますreturn null(または単にreturnそれを好む場合)。

CoffeeScriptの暗黙のreturn挿入が好きかどうかはわかりません。'明示的は暗黙的よりも優れている'と主張されるかもしれません。また、最初のキーワードは、たとえば、などの別のキーワードであってreturnはならないと主張することもできます。returnstopfinish

無関係な補足として、promiseを使用したときに目立った利点は見られませんでした。deferredそれどころか、非同期プログラミングの上に置かれているそれらの概念や他の概念では、それらが私のコードに非常に煩わしいことに気づきました。

于 2014-07-21T10:27:03.923 に答える