处理Node的异步性质 - writeFile回调

时间:2013-08-04 17:17:00

标签: javascript node.js asynchronous callback coffeescript

我在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 ..)。

3 个答案:

答案 0 :(得分: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并不关心回调的回归。

答案 1 :(得分:1)

您可以引入帮助函数:

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

答案 2 :(得分:0)

由于唯一一次你不想加载数据库并且获取是因为db不存在并且后续加载会产生错误,你可以尝试这样的事情......

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

    @db = db
    @_fetch()