Node.js 关于回调的Coffescript和Nodejs编码风格
让我们开门见山吧。我喜欢CS,我喜欢node,我非常喜欢使用回调,就像上帝建议的那样 不幸的是,我通常会经常检查稍微嵌套的回调中的错误 下面是完成相同示例任务的三种不同样式。 哪种方法可以避免缩进和条件地狱,同时又不牺牲可读性 如果不使用Promissions、async或iced cs,请随意推荐一个新的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
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
,等等。哇,我甚至不知道代码审查是否存在,谢谢。至于异步选项当然更好,但它并不总是一个选项。我想知道适合这些时刻的最佳风格。:)