对象函数(){}没有方法'我的方法'

时间:2015-01-07 15:00:32

标签: javascript events callback closures

我正在使用方法(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扭曲。这样做最优雅的方式是什么?

2 个答案:

答案 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));

MDN: fun.bind(thisArg\[, arg1\[, arg2\[, ...\]\]\])