Node.js 关于回调的Coffescript和Nodejs编码风格

Node.js 关于回调的Coffescript和Nodejs编码风格,node.js,coding-style,coffeescript,Node.js,Coding Style,Coffeescript,让我们开门见山吧。我喜欢CS,我喜欢node,我非常喜欢使用回调,就像上帝建议的那样 不幸的是,我通常会经常检查稍微嵌套的回调中的错误 下面是完成相同示例任务的三种不同样式。 哪种方法可以避免缩进和条件地狱,同时又不牺牲可读性 如果不使用Promissions、async或iced cs,请随意推荐一个新的 authenticate: (token, cb) => @collection 'services', (err, collection) => if err

让我们开门见山吧。我喜欢CS,我喜欢node,我非常喜欢使用回调,就像上帝建议的那样

不幸的是,我通常会经常检查稍微嵌套的回调中的错误

下面是完成相同示例任务的三种不同样式。 哪种方法可以避免缩进和条件地狱,同时又不牺牲可读性

如果不使用Promissions、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:在第二个问题上,我使用了
if not err
而不是
,除非符合


提前谢谢大家^_^

我在CoffeeScript中处理错误的首选样板是
返回回调错误if error
。所以

queryDb conditions, (error, results) ->
  return callback error if error
  console.log result for result in results
  • 这是一艘1号班轮
  • 我强烈希望错误处理始终处于顶部,并使用
    return
  • 这使成功代码保持在相同的缩进级别,而不是执行
    if/else

我在CoffeeScript中处理错误的首选样板是
返回回调错误if error
。所以

queryDb conditions, (error, results) ->
  return callback error if error
  console.log result for result in results
  • 这是一艘1号班轮
  • 我强烈希望错误处理始终处于顶部,并使用
    return
  • 这使成功代码保持在相同的缩进级别,而不是执行
    if/else

第一个更接近于
nodejs
内部使用的功能,例如在
fs
模块中

err
是第一个参数,因此首先检查它是有意义的。一旦它退出,它就会“深入”回调堆栈

第一个和第三个选项编译为相同的JS,但显式返回除外

哪一个更容易阅读和识别关键部分?考虑在几个月后检查代码


来自Python背景,我更喜欢使用更开放的结构(例如第一个),除非更紧凑的形式更清晰。因此,虽然我喜欢Coffeescript的理解,但我不太喜欢省略所有可能的
{}
()
的表达式。如果我不得不停下来在脑海中重新添加这些内容,那么简洁性就太过分了。

第一个内容更接近于
nodejs
内部使用的内容,例如在
fs
模块中

err
是第一个参数,因此首先检查它是有意义的。一旦它退出,它就会“深入”回调堆栈

第一个和第三个选项编译为相同的JS,但显式返回除外

哪一个更容易阅读和识别关键部分?考虑在几个月后检查代码

来自Python背景,我更喜欢使用更开放的结构(例如第一个),除非更紧凑的形式更清晰。因此,虽然我喜欢Coffeescript的理解,但我不太喜欢省略所有可能的
{}
()
的表达式。如果我不得不停下来在脑海中重新添加这些内容,那么简洁性就太过分了。

使用它可能看起来像这样:

{flow}=需要“扁平流”
验证:(令牌,完成)->
流{getCollection:@collection}[
#收集。
(完成)->
@getCollection“服务”(错误,集合)->
完成错误,{collection}
#得到服务
(完成)->
@collection.findOne{token},(错误,服务)->
完成错误,{service}
##获取服务(备选方案)
#(完成,{collection})->
#collection.findOne{token},(错误,服务)->
#完成错误,{service}
],(呃,{service})->
完成错误、服务
#您也可以使用@service。
在长调用链上(带或不带条件)它仍然是干净的。

使用它可能看起来像这样:

{flow}=需要“扁平流”
验证:(令牌,完成)->
流{getCollection:@collection}[
#收集。
(完成)->
@getCollection“服务”(错误,集合)->
完成错误,{collection}
#得到服务
(完成)->
@collection.findOne{token},(错误,服务)->
完成错误,{service}
##获取服务(备选方案)
#(完成,{collection})->
#collection.findOne{token},(错误,服务)->
#完成错误,{service}
],(呃,{service})->
完成错误、服务
#您也可以使用@service。

在长调用链(有条件或无条件)上,它仍然是干净的。

这可能更适合。但是,如果最内部的回调只是确定如何调用
cb
,则可能不需要--
collection.findOne令牌:令牌,cb
。而且,就我个人而言,我建议重新考虑
async
,等等。哇,我甚至不知道代码审查是否存在,谢谢。至于异步选项当然更好,但它并不总是一个选项。我想知道适合这些时刻的最佳风格。:)这可能更适合你。但是,如果最内部的回调只是确定如何调用
cb
,则可能不需要--
collection.findOne令牌:令牌,cb
。而且,就我个人而言,我建议重新考虑
async
,等等。哇,我甚至不知道代码审查是否存在,谢谢。至于异步选项当然更好,但它并不总是一个选项。我想知道适合这些时刻的最佳风格。:)