0

让我们进入正题。我喜欢 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

谢谢大家。^_^

4

3 回答 3

3

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

queryDb conditions, (error, results) ->
  return callback error if error
  console.log result for result in results
  • 这是一个 1 班轮
  • 我强烈希望错误处理始终位于顶部并使用return
  • 这使成功代码处于相同的缩进级别,而不是执行if/else
于 2013-08-25T14:49:48.550 回答
0

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

err是第一个参数,所以首先检查它是有意义的。一旦它不碍事,它就会“深入”到回调堆栈中。

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

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

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

于 2013-08-25T22:06:36.860 回答
0

使用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.

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

于 2015-02-02T14:03:58.153 回答