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 ofrunCallback 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); };

可变参数长度的解决方案(即:广义的“绑定”方法)更长,但如果您正在在线定义内容,我在这里得到的可能就是您所需要的。

只需确保不要this在包装函数中使用(无论是将其保存到 var,还是直接将其传递给另一个函数),因为它将引用window.

于 2013-03-15T20:21:38.690 回答