1

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

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

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 # has no method 'uploadImage'

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

this.uploadImage

也:

that = this
that.uploadImage

都不工作。

如果我在 forEach 循环之外调用 fileInfo.handleImage ,它可以很好地处理这个或那个。

4

2 回答 2

1

更改fileInfo.handleImagefileInfo.handleImage.bind(fileInfo)(假设fileInfo是 的一个实例FileInfo

它正在丢失您期望的this绑定(即该函数执行时的this不要与执行上下文混淆,请参阅注释),因为您不会立即调用它,只需传递对它的引用。

于 2012-11-05T01:00:26.480 回答
0

您可以使用上面建议的绑定或粗箭头 (=>)

但是,要使胖箭头起作用,您需要使用惯用的 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 中的绑定。

于 2012-11-05T13:44:00.450 回答