CoffeeScript保留多个`this`对象?

时间:2015-01-20 23:27:18

标签: node.js express sqlite coffeescript

我处在一个相当独特的境地(我之前从未发现过自己的情况),我找不到应该如何处理的事情,所以我想我会问这里。 (也许可以开始讨论如何处理它)

我正在编写一个Node.js / Express应用程序,它在各种路由处理程序中执行一系列数据库调用。我正在使用node-sqlite3模块进行数据库调用。在这种情况下,用户正在上传文件,因此我从表单POST数据中获取该文件并将其保存到文件系统(稍后将移动到blob存储)并由于其他原因生成一些xml文件。我命名这些文件的方式是通过数据库中的id来促进后来的'/ file /:id'之类的路由来获取文件,以及利用数据库来确保我没有名称冲突问题。

我在CoffeeScript中执行此操作,因此我将此模型包装在class中,因此它使用this(或@)来访问这些帮助程序方法。在我进行last_insert_rowid()调用以获取我刚插入的东西的ID之前,这会让我了解潜在的竞争条件。因此,当你在node-sqlite3模块中执行INSERT时,它完成时调用的回调会将最后插入的行ID保存在this对象中(所以(err) -> fileid = @.lastID)。现在有些代码(名称已更改和简化)。

uploadFile: (fileData, cb) ->
  @.openConnectionIfClosed()
  @db.serialize =>
    # preserve the @ object to allow calls to class methods like @.saveFile
    @db.run 'insert into thing (val=$val)', $val: 'some_val', (err) ->
      if err
        cb err
        return

      # @ refers to the this object provided by @db.run
      fileid = @.lastID

      async.waterfall [
        (async_cb) =>
          # uh oh, the @ object is the one from the db library, not my class
          # earning me a 'method undefined' error
          @.saveFile fileid, async_cb 
        # etc... you get the idea
        ...
      ], (err) -> cb err
  @.closeConnection()

所以我需要保留类this对象来访问实例方法,但我还需要从默认返回的lastID对象中获取this值。 db调用中的回调。显然,如果我将db调用的回调更改为胖箭头,我可以访问我的类方法,但@.lastID返回undefined

实现这个目标的“正确”方法是什么? (在CoffeeScript或JavaScript中,并不特别重要)我认为我可以解决这个问题的方法是在方法的顶部分配一个像ctxt = @这样的上下文变量,但显然这是不利的。有什么想法吗?

编辑:哦,我忘了提及,我不能只是将文件命名为别的,因为我还需要该id来更新数据库。对async.waterfall的调用可以:保存文件 - >生成xml元数据文件&保存 - >追溯性地将xml文件的路径添加到数据库条目中。虽然我可能在没有完全隔离的数据库调用的情况下使用语句来执行此操作,但尚未对此进行调查。

1 个答案:

答案 0 :(得分:0)

在JavaScript中,如果你需要保留一个特定的上下文,它的标准做法是使用变量self,如下:

var self = this;

在CoffeeScript中,胖箭是这种情况的标准做法,尽管使用'self'也没有错。