ES6:尽管使用了bind()

时间:2016-04-15 19:18:22

标签: javascript angularjs closures ecmascript-6

注意:我使用Babel作为我的发布者

我正在尝试使用私有方法的一些概念来实现ES6类。要做到这一点,我已经在类声明之外声明了一个函数,并且我也尝试使用闭包来进行DRY实践。

但是,当我的类方法调用" private"方法 this 的上下文变为未定义。我认为使用bind()应该明确设置上下文,但它似乎没有工作。

function _invokeHttpService(httpMethod) {
    return (url, config, retries, promise) => {
      var s = this;
      // Do some additional logic here...
      httpMethod(url, config)
        .then(
          response => {
            s._$log.info(`Successful response for URL: ${url}`);
            promise.resolve(response);
          },
          error => {
            s._$log.error(`Request for URL: ${url} failed.`);
            promise.reject(error)
          });
    }
  }

  function _get(url, config, retries, promise) {
    _invokeHttpService(this._$http.get);
  }

  class httpSessionService {
    /*@ngInject*/
    constructor($log, $http, $q, $timeout, CODE_CONSTANTS, $rootScope) {
      this._$log = $log;
      this._$http = $http;
      this._$q = $q;
      this._$timeout = $timeout;
      this._$rootScope = $rootScope;
      this._CODE_CONSTANTS = CODE_CONSTANTS;
    }

    get(url, config, retries = 5) {
      var s = this;
      var deferred = s._$q.defer();
      _get(url, config, retries, deferred).bind(this);
      return deferred.promise;
    }
  }

1 个答案:

答案 0 :(得分:2)

bind创建一个函数的副本,其中var f = _get.bind(this); f(url, config, retries, deferred); 设置为第一个参数。

bind

您要使用的是call,它基本上是this,但该函数会立即被调用。第一个参数是_get.call(this, url, config, retries, deferred); 的值,而后面​​的任何参数都传递给你正在调用的函数。

call

_get.apply(this, [url, config, retries, deferred]); 有一个名为apply的姐妹函数,它执行相同的操作,但在数组中获取实际参数。

javax.xml.transform.TransformerException: The URI http://xml.apache.org/xslt/java does not identify an external Java class
    at com.icl.saxon.style.StyleElement.styleError(StyleElement.java:818)
    at com.icl.saxon.style.XSLStyleSheet.process(XSLStyleSheet.java:626)
    at com.icl.saxon.Controller.transformDocument(Controller.java:1121)
    at com.icl.saxon.Controller.transform(Controller.java:994)
    at org.intellij.plugins.xsltDebugger.rt.engine.local.LocalDebugger$1.run(LocalDebugger.java:63)
    at java.lang.Thread.run(Thread.java:745)

当你不确定你传递给函数的参数有多少时很有用。