2016-04-15 17 views
0

注:私はプライベートメソッドのいくつかの概念とES6クラスを実装しようとしています私のtranspilerES6:これはバインドを使用しているにもかかわらず定義されていません()

ためバベルを使用しています。これを行うために、クラス宣言の外で関数を宣言しました。また、DRYプラクティスのクロージャを使用しようとしています。

しかし、私のクラスメソッドが "private"メソッドを呼び出すと、のコンテキストは未定義になります。私は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; 
    } 
    } 

答えて

2

bind最初の引数にthisセットで機能のコピーを作成します。あなたが使用したい何

var f = _get.bind(this); 
f(url, config, retries, deferred); 

は基本的にbindあるcallですが、機能はすぐに呼び出されます。最初の引数はthisの値ですが、それ以降の引数は呼び出している関数に渡しています。

​​

call同じことを行いますが、アレイ内の実際の引数を取りapplyと呼ばれる姉妹機能を持っています。

_get.apply(this, [url, config, retries, deferred]); 

関数に渡す引数の数が不明な場合に便利です。

+1

これは素晴らしい説明です。ありがとうございます! – rawkfist0215

関連する問題