2017-03-22 19 views
1

角度のものは私を狂っている! thaのアプリがベアラ認証を使用し、それはほとんど動作します。この角度defereは未定義

function errorInterceptor($injector, $log, $location) { 
     var inFlight = null; 
     var authInterceptorServiceFactory = {}; 
     var _request = function (config) { 
      config.headers = config.headers || {};  
      var oauthToken = $injector.get('oauthService').getAuthorizationHeader(); 
      if (oauthToken) { 
       config.headers.Authorization = oauthToken;  
      } 
      return config; 
     } 

     var _responseError = function (rejection) {  
      debugger   
      var deferred = $injector.get('$q').defer(); 
      switch(rejection.status){ 
       case 401: 
        console.log('401'); 
        if(inFlight == null){ 
         var authService = $injector.get('oauthService'); 
         inFlight = authService.refreshToken() //this is just a $http call 
        } 
        inFlight 
         .then(function (response) { 
          _retryHttpRequest(rejection.config, deferred) 
           .success(function (result) { 
            deferred.resolve(result); 
           }) 
           .error(function(err, status) { 
            deferred.reject(err); 
           }) 
           .finally(function() {          
            inFlight = null; 
           }); 
          $injector.get('oauthService').setLocalStorageData(response.data); 

         }, 
         function (err, status) { 
           $injector.get('oauthService').logOut(); 
         }); 
        break; 

      } 

      return deferred.promise; 
     } 

     var _retryHttpRequest = function (config, deferred) { 
      var $http = $http || $injector.get('$http'); 
      return $http(config); 
     } 

     authInterceptorServiceFactory.request = _request; 
     authInterceptorServiceFactory.responseError = _responseError; 

     return authInterceptorServiceFactory; 
    } 

ようerrorInterceptorがあり、第一401応答はその後、後続のすべての要求は新しいトークンで再送信された「refreshToken」要求を発行します。私が直面してる 問題が

deferred.resolve(result); 

ラインであるとの結果が予想されるオブジェクトですが、約束の関数が呼び出されたときにその引数が定義されていません!

約束機能

sidebarService.getMenu() 
     .success(sidebarReady) 
     .error(sidebarReadyError); 

function sidebarReady(items) { 
     //when errorInterceptor catches the error 
     //and re-sends, when it resolves this funciton, argument is undefined 
     // 
    } 

誰も助けてくださいことはできますか? ありがとう

+0

@Nekudotayim おかげで私は表示されません。成功したコールバックとして機能を設定しているだけで、何も渡されません。 –

+1

これはあなたの質問には関係ありませんが、あなたのrefreshtokenをlocalstorageに保存することはセキュリティ上の責任であるかもしれないことに注意してください。 JavaScriptによってアクセスできるため、潜在的なXSS攻撃を受ける可能性があります。だから、もしそれをlocalstorageに保存したいのであれば、あなたのコードは一切なく、あなたのライブラリのどれもがXSSの影響を受けていないことを絶対に確かめる必要があります。 –

+0

[遅延反パターン]を避けてください(http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)!例えば、 'inFlight'があなたの拒否を拒否した場合、決済は決して決済されません。 – Bergi

答えて

1

.success()の代わりに.then()を使用してください。これは、Angular 1.5以降では廃止されており、1.6では削除されています。 .success()を使用すると、新たな約束を返さないため、約束の連鎖は不可能です。

+0

ありがとう! :D –

+0

これまでのところ、私はコードフラグメントをテストできなかったので、私はこれらの約束が主な問題であると確信しています。 [この説明](http://blog.ninja-squad.com/2015/05/28/angularjs-promises/)は私を多く助けました。 – Nekudotayim

0

.success()の代わりに.then()を使用したことが判明しました。あなたは `sidebarReady`関数にパラメータを渡しているところも

感謝@Benと@Nikolay

:)