1

後でイベントで起動できるコールバックを格納する関数をセットアップしようとしていますが、コンテキストが正しくバインドされていません。セットアップは基本的に次のようになります。

app.myObject = function(){
  this.bindEvents();
};
app.myObject.prototype = {
  bindEvents: function(){
    var self = this;
    this.library = new OutsideLibrary();
    this.library.onMyEvent = function(data) {
      OtherLibrary.processData(data, self.runCallback); // I'm not able to pass a context here...
    }
  },
  sendToLibrary: function(message,callback) {
    this.callback = callback;
    this.library.send(message);
  }
  // ... and this doesn't work because it gets evaluated in the wrong context.
  runCallback: function() { 
    if (this.callback) {
      this.callback();
      this.callback = null;
    }
  }
}

上記のコードが理にかなっていることを願っています。アイデアは、私が呼び出すことができるAPIを公開しようとしているということです。

app.myObject.sendToLibrary("something", function() {...});

...そして、チェーン全体が完了した後、コールバック関数が実行されます。

問題は、sendToLibraryイベントが発生したときにコールバックを別のオブジェクトに渡す必要があるため、直接受信したコールバックを渡すことができないことです。また、現在渡されたコールバックを保存する必要があり、コールバックはオプションであるため、起動したら設定を解除する必要があります。実際にはrunCallback、コールバックを実行する関数を渡してから設定を解除する必要があります。

とにかく、問題は、runCallback最終的に実行されたときに、それがもはや正しいコンテキストにないため、機能しないことです。これを修正する方法についての私の最初のアイデアrunCallbackは、コンテキスト引数を含むように関数を変更することでした。これにより、パスできますself.runCallback(self)が、すぐに実行されるため、目的が果たせなくなります。

とにかく、私はここのコールバックの森でちょっと迷っています、そして私の道を見つけるのにいくつかの助けをいただければ幸いです:)

私の質問は、コールバック関数と正しいコンテキストを今すぐ実行せずにラップして、最終的に起動したときに正しいコンテキストから実行する方法はありますか?

ありがとう!

4

2 に答える 2

1
OtherLibrary.processData(data, function() {
    self.runCallback();
)};

次に、insideはrunCallback this、のインスタンスを参照します(app.myObjectこれが必要な場合)。

于 2013-03-15T20:17:54.430 に答える
1

アンドリュー、ここであなたは少し頑張っているかもしれないと思います。

コンテキストをバインドするだけの場合は、次のいずれかを実行できます。

var working_method = context.method.bind(context);
// bind is IE9+, and does something similar to the below

// or, from whatever scope your context/method are available in, define this function
var working_method = function () { context.method(); };

パラメータが必要で、フットプリントをすでに知っている場合:

var working_method = function (a, b, c) { context.method(a, b, c); };

可変引数長のソリューション(つまり、一般化された「bind」メソッド)は長くなりますが、行で定義している場合は、ここにあるものだけで十分かもしれません。

を参照するため、ラッピング関数で使用しないように注意してthisください(varに保存するか、別の関数に直接渡すかは関係ありません)window

于 2013-03-15T20:21:38.690 に答える