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 <--在编译代码中)

如何避免咖啡脚本编译器的这种行为(在不需要的地方隐式返回)?

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

你不能,确切地说。您可以在不需要时忽略它们(这是最常见的做法),也可以通过在函数末尾添加附加语句来提供明确的替代方案。我认为在你的代码库中一直尝试这样做是在与你无法获胜的语言进行一场战争,所以我个人的建议是接受 Ashkenas 先生的隐含回报,然后继续你的快乐之路。

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

第一个return是停止执行,而不是返回值。

return您仍然可以从回调的最后一行在您的 JS 中获得额外的(且毫无意义的) ;为了避免那个,插入一个额外的return null(或者return如果你愿意的话)。

我不确定我是否喜欢 CoffeeScript 的隐式return插入;可能会声称“显式优于隐式”。此外,可以说第一个return不应该是一个return关键字,而是另一个关键字,比如,说,stopfinish类似的。

作为一个不相关的旁注,我在使用 Promise 时没有观察到任何明显的优势。相反,我发现它们在我的代码中非常具有侵入性,与那些deferred放在异步编程之上的 s 和其他概念有关。

于 2014-07-21T10:27:03.923 回答