【问题标题】:Dealing with Node's async nature - writeFile callback处理 Node 的异步特性 - writeFile 回调
【发布时间】:2013-08-05 09:53:01
【问题描述】:

我在 CoffeeScript 类中有以下函数:

 use: (db, fn) ->
    fs.exists db, (exists) =>
      if exists?
        @db = db
        @_fetch()
      else
        fs.writeFile db, {}, (err) =>
          if err 
            err
          else 
            @db = db
            @_fetch()

困扰我的是我不得不写两次@db = db@_fetch()。我必须这样做的原因是else 子句调用了异步的fs.writeFile。因此,我必须将这两行放在writeFile 的回调中,以确保它们不会过早触发。

但是,有没有办法清理它并写下那些行?目前只有两行,但是如果存在10行的回调呢?会变得一团糟,不是吗?

也欢迎对这段代码提供任何其他反馈。不太确定错误处理(目前只返回err..)。

【问题讨论】:

  • fn是你的回电吗?

标签: javascript node.js asynchronous callback coffeescript


【解决方案1】:

CoffeeScript 有函数,=> 允许您将函数绑定到实例,那么为什么不直接将代码拆分为绑定函数呢?

use: (db, fn) ->
  fetch = =>
    @db = db
    @_fetch()
  fs.exists db, (exists) =>
    if exists?
      fetch()
    else
      fs.writeFile db, {}, (err) =>
        if err 
          err
        else 
          fetch()

然后将其他需要做的事情(例如调用fn)添加到fetch

另外,我不认为你的:

if err
  err

错误处理可以做任何事情。我不是 node.js 专家,但是,AFAIK,writeFile 不在乎回调返回什么。

【讨论】:

    【解决方案2】:

    你可以引入一个辅助函数:

    use: (db, fn) ->
      helper = () =>
        @db = db
        @_fetch()
        …
        fn(null, result)
    
      fs.exists db, (exists) =>
        if exists
          helper()
        else
          fs.writeFile db, {}, (err) ->
            if err
              fn(err)
            else
              helper()
            return
        return
    

    【讨论】:

      【解决方案3】:

      由于您不想加载数据库并获取唯一的时间是如果数据库不存在并且随后的加载会产生错误,您可以尝试这样的事情......

      use: (db, fn) ->
          fs.exists db, (exists) =>
          if not exists?
              fs.writeFile db, {}, (err) =>
                  if err 
                      return err
      
          @db = db
          @_fetch()
      

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 2018-10-27
        • 2016-12-13
        • 2016-08-08
        • 1970-01-01
        相关资源
        最近更新 更多