我正在使用方法(searchTransportation
)进行事件回调。
exports.searchTransportation = function (items, num, UrlS) {
//...
}
exports.doHotelInsertion = function(items, num, typetransport, UrlS, callback) {
// (omitted code)
event.on("STARTWITHAIRSEARCH" + num, searchTransportation ); //!!! causes error
};
我试过像
那样的人 event.on("STARTWITHAIRSEARCH" + num, this.searchTransportation(items, num,
UrlS).bind(this));
但这会破坏代码并最终结束 对象功能(){}没有方法' searchTransportation'
我知道事件回调是在全局范围内,但有没有办法调用现有方法?
- 编辑
这有点像这样的问题:Class methods as event handlers in javascript但是有一个nodejs扭曲。这样做最优雅的方式是什么?
答案 0 :(得分:3)
在callback
函数调用event.on
之前,您的this.searchTransportation.bind(...)
被调用了。
所以基本上你丢失了有效的 this 指针,因为函数已经终止了。 此指针不再引用有效对象(可能是您的对象超出范围并从内存中清除)。
您有两种方法可以解决此问题: 第一个是创建局部变量,这些变量将存储到异步调用结束:
exports.doHotelInsertion = function(items, num, typetransport, UrlS, callback) {
var _items = items;
var _num = num;
var _UrlS = UrlS;
var localthis = this;
event.on("STARTWITHAIRSEARCH" + num, localthis.searchTransportation(_items, _num, _UrlS));
};
第二个也是更优雅的一个是将变量作为参数绑定到异步调用中,以便保存它们。
exports.doHotelInsertion = function(items, num, typetransport, UrlS, callback) {
// somestuff
var localthis = this;
event.on("STARTWITHAIRSEARCH" + num, localthis.searchTransportation(items, num, UrlS));
};
你仍然需要为此创建一个局部变量,但至少对其他变量来说它会更整洁。
答案 1 :(得分:2)
我猜测searchTransportation
没有返回函数,所以你的绑定行看起来应该是这样的
event.on("STARTWITHAIRSEARCH" + num, this.searchTransportation.bind(this, items, num, UrlS));