原型和async.forEach的范围问题

时间:2012-11-05 00:58:05

标签: javascript node.js asynchronous coffeescript

我有一个我不明白的范围问题。

我有一些方法有这个对象:

FileInfo = (file) ->
   @name = path.basename(file.path);

FileInfo::uploadImage = (filename, callback) ->

FileInfo::handleImage = (version, callback) ->
   # Here I would like to call uploadImage

我从async.forEach循环调用handleImage:

async.forEach options, fileInfo.handleImage,  (err) -

我想从handleImage中调用uploadImage,但我得到TypeError:Object#没有方法'uploadImage'

我在handleImage中尝试了以下内容:

this.uploadImage

以及:

that = this
that.uploadImage

都没有工作。

如果我在forEach循环之外调用fileInfo.handleImage,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

fileInfo.handleImage更改为fileInfo.handleImage.bind(fileInfo)(假设fileInfoFileInfo实例

当该函数正在执行时,它正在丢失this绑定(即this,不要与execution context混淆,你期望的,因为你没有立即调用它,只需传递一个引用。

答案 1 :(得分:0)

您可以使用上面建议的bind或胖箭头(=>)

然而,为了使胖箭工作,你需要使用惯用的Coffeescript 类。通过分配原型来构建一个正常的Javascript方法 插槽不会工作。

class FileInfo
    constructor: (file) -> 
        @name = path.basename(file.path);

    uploadImage: (filename, callback) ->

                                     ---- fat arrow here
                                     V
    handleImage: (version, callback) =>
    # Here I would like to call uploadImage

以这种方式使用它会强制CoffeeScript编译器为您生成Javascript中的绑定。