【问题标题】:Coffescript and Nodejs coding style regarding callbacks关于回调的 Coffeescript 和 Node Js 编码风格
【发布时间】:2015-02-02 22:03:58
【问题描述】:

让我们进入正题。我喜欢 CS,我喜欢 node,而且我非常喜欢按照上帝的建议使用回调。

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

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

如果不使用 Promise、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 而不是unless 以符合https://github.com/polarmobile/coffeescript-style-guide

提前谢谢大家。 ^_^

【问题讨论】:

  • 这可能更适合Code Review SE。不过,如果最内部的回调只是确定如何调用cb,则可能不需要它——collection.findOne token: token, cb。而且,就我个人而言,我建议重新考虑async 等——gist.github.com/coiscir/2ab7751207d5af6b4e0b
  • 哇,我什至不知道 Code Review 的存在,谢谢。至于异步选项当然更好,但它并不总是一个选项。我想知道这些时刻的最佳风格。 :)

标签: node.js coding-style coffeescript


【解决方案1】:

我首选的 CoffeeScript 错误处理样板是 return callback error if error。所以

queryDb conditions, (error, results) ->
  return callback error if error
  console.log result for result in results
  • 这是一个 1-liner
  • 我强烈希望错误处理始终位于顶部并使用return 短路逻辑
  • 这会将成功代码保留在相同的缩进级别,而不是执行if/else

【讨论】:

    【解决方案2】:

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

    err 是第一个参数,因此首先检查它是有意义的。一旦它不碍事,它就会“向下钻取”到回调堆栈的更深处。

    第一个和第三个选项编译成同一个JS,除了显式返回。

    哪个更容易阅读和识别基本部分?考虑在几个月后审查代码。

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

    【讨论】:

      【解决方案3】:

      使用flat-flow 可以看起来像这样:

      { flow } = require 'flat-flow' 
      
      authenticate: (token, done) ->
        flow { getCollection: @collection }, [
      
          # Get collection.
          (done) ->
            @getCollection 'services', (err, collection) ->
              done err, { collection }
      
          # Get service
          (done) ->
            @collection.findOne { token }, (err, service) ->
              done err, { service }
      
          # # Get service (alternative)
          # (done, { collection }) ->
          #   collection.findOne { token }, (err, service) ->
          #     done err, { service }
      
        ], (err, { service }) ->
          done err, service
      
          # You can use @service as well.
      

      它在长调用链上仍然很干净(有或没有条件)。

      【讨论】:

        猜你喜欢
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多