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.handleImageします。fileInfo.handleImage.bind(fileInfo)fileInfoFileInfo

this期待するバインディング (つまり、その関数が実行されているときの値実行コンテキストthisと混同しないでください。コメントを参照してください) を失います。すぐに呼び出すのではなく、参照を渡すだけだからです。

于 2012-11-05T01:00:26.480 に答える
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 でバインディングを生成します。

于 2012-11-05T13:44:00.450 に答える