对象函数 () { } 没有方法 'my method'

Object function () { } has no method 'my method'

我正在使用一种方法 (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'

我知道事件回调在全局范围内,但有没有办法调用现有方法?

-- 编辑

这有点像这个 SO 问题:Class methods as event handlers in javascript 但带有 nodejs 扭曲。这样做最优雅的方法是什么?

我猜 searchTransportation 不是 return 函数,所以你的绑定行应该是这样的

event.on("STARTWITHAIRSEARCH" + num, this.searchTransportation.bind(this, items, num, UrlS));

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

发生的事情是你的 callback 在你的 event.on 函数调用 this.searchTransportation.bind(...) 之前被调用。

所以基本上您正在丢失有效的 this 指针,因为该函数已经终止。 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));
};

你仍然需要为此创建一个局部变量,但至少对于其他变量来说它会更整洁。