【问题标题】:Object function () { } has no method 'my method'对象函数(){}没有方法“我的方法”
【发布时间】:2015-03-05 12:15:15
【问题描述】:

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

但这是破坏代码并以 Object function () { } 没有方法'searchTransportation'

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

-- 编辑

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

【问题讨论】:

    标签: javascript events callback closures


    【解决方案1】:

    发生的情况是,您的 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));
    };
    

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

    【讨论】:

      【解决方案2】:

      我猜searchTransportation 没有返回函数,所以你的绑定线应该是这样的

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

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

      【讨论】:

      • 谢谢!但现在我得到一个'SearchTravelSolution.js:无法调用未定义的方法'bind'
      • 这是 searchTransportation 所在的同一个对象吗?这里需要更多上下文。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      相关资源
      最近更新 更多