2015-12-08 31 views
0

我有以下函數來獲取登錄用戶。我不得不說,我已經從教程中複製了代碼 - 因此我不知道在後臺發生了什麼。 幾分鐘後(20分鐘),沒有請求令牌不再有效,如果getCurrentUser()被調用,我會得到一個白色的屏幕(來自後端的HTTP 401) - 我的錯誤攔截器$httpProvider.interceptors.push(errorInterceptor);不會被調用。AngularJS從後端獲取當前用戶 - 錯誤攔截器

我現在的問題是如何處理這種情況。 ist可能強制getCurrentUser()中的errorInterceptor- invokation或如何處理?

function getCurrentUser() { 
     var deferred = $q.defer(); 
     if(currentUser){ 
      deferred.resolve(currentUser); 
     } else { 
      getCurrentUserFromAPI().success(function(data) { 
       if(data) { 
        currentUser = data; 
        return deferred.resolve(currentUser); 
       } 
      }).error(function(data) { 
       var token = authTokenService.getToken(); 
       if(token) { 
        authTokenService.deleteToken(); 
       } 
       return deferred.reject(data); 
      }); 
     } 
     return deferred.promise; 
    } 

[編輯]

這是我在底部攔截器,我認爲錯誤響應函數總是調用時,後端的響應錯誤 - 例如HTTP 401,但是當函數getCurrentUser被調用並且HTTP 401是來自服務器的響應時,不調用此方法 - 因此我得到一個白色屏幕。

其實我不知道該怎麼做才能防止這個白屏? 在這種情況下我能做什麼?

(function() { 
'use strict'; 

angular 
    .module('myProject.error') 
    .config(configure); 

configure.$inject = ['$httpProvider']; 

function configure($httpProvider) { 
    $httpProvider.interceptors.push(errorInterceptor); 

    //////////// 

    function errorInterceptor($injector, $q, $location) { 
     var interceptor = { 
       responseError: responseError 
     }; 

     return interceptor; 

     //////////// 

     function responseError(response) { 
      alert('responseError') 
      switch(response.status) { 
      case ... 
      } 
      return $q.reject(response); 
     } 
    } 
} 

})();

+0

你的問題不清楚。請詳細說明。 – FrailWords

回答

0

當您在.success方法中有空數據時,您看起來好像不能解決您的deffered問題。

試試這個:

function getCurrentUser() { 

    if (currentUser) return $q.when(currentUser); 

    return getCurrentUserFromAPI(
       ).then(function(response) { 
         if (response.data) { 
          currentUser = response.data; 
          return currentUser; 
         } else { 
          currentUser = null; 
          throw null; 
         }  
        },function(error) { 
         var token = authTokenService.getToken(); 
         if (token) { 
          authTokenService.deleteToken(); 
         }; 
         throw error; 
        }); 
    }; 
}; 

棄用通知

.success.error方法現在已經過時,在$http服務。請使用.then.catch.finally方法。欲瞭解更多信息,請參閱AngularJS $http Service API Reference

0

我加入這個代碼:

if(resp.$$state.status == 0) { 
     $location.path('/signin') 
    } 

,然後將其到目前爲止的作品(exept我重裝瀏覽器視圖 - 那麼我重定向到LOGIN-頁),但實際上我不知道是什麼RESP。 $$ state.status是,爲什麼它是0.而且我也不知道爲什麼函數(錯誤)功能(成功)不會被調用 - 當我在瀏覽器中調試成功和錯誤回調不會被調用。 也許有人確實有這個問題的答案。

function getCurrentUser() { 
     if (currentUser) { 
      return $q.when(currentUser); 
     } 
    var resp = getCurrentUserFromAPI().then(function(response) { 
      if (response.data) { 
       currentUser = response.data; 
       return currentUser; 
      } else { 
       currentUser = null; 
       throw null; 
      }  
     }, function(error) { 
      var token = authTokenService.getToken(); 
      if (token) { 
       authTokenService.deleteToken(); 
      } 
      throw error; 
     }); 

    if(resp.$$state.status == 0) { 
     $location.path('/signin') 
    } 

    return resp; 
    }; 

function getCurrentUserFromAPI() { 
     return $http.get(api_config.BASE_URL + '/getCurrentLoggedUser'); 
    }