我正在尝试设置一个存储回调的函数,该函数可以在以后的事件中触发,但我没有得到正确绑定的上下文。设置基本上是这样的:
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)
- 但是会立即执行,因此它会失败。
无论如何,我有点迷失在这里的回调林中,并希望找到一些帮助找到出路:))
我的问题是:有没有办法结束回调函数和正确的上下文,而不是现在执行它,这样当它最终触发它时,它是从正确的上下文中完成的?
谢谢!
答案 0 :(得分:1)
OtherLibrary.processData(data, function() {
self.runCallback();
)};
然后在runCallback
this
内部引用app.myObject
的实例,如果这是您想要的。
答案 1 :(得分: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
。