2015-04-08 7 views
0

У меня есть фабрика и ее функция - обрабатывать коды статуса перенаправления. Если он видит, что код состояния равен 302, он перенаправляет страницу на страницу входа.Ошибка: обещание не определено

app.factory('redirectInterceptor', function($q,$location){ 
    return { 
     responseError : function(response){ 
      return promise.then(
       function success(response) { 
        if(response.status === 302){ 
         alert("success " +response.status); 
         $location.path('/login.html'); 
         return response; 
        } 
        else{ 
         alert("success " +response.status); 
         return response; 
        } 
       }, 
       function error(response) { 
        if(response.status === 302){ 
         alert("error " +response.status); 
         $location.path('/public/login.html'); 
         return $q.reject(response); 
        } 
        else{ 
         alert("error " +response.status); 
         return $q.reject(response); 
        } 
       } 
      ); 
     } 
    } 
}); 

app.config(['$httpProvider',function($httpProvider) { 
    $httpProvider.interceptors.push('redirectInterceptor'); 
}]); 

Но я получаю ошибку после того, как сервер возвращает 302. здесь

Error: promise is not defined

Что я сделал не так?

+0

Обещание на линии 4 кода никогда не был определен. – pixelbits

+0

@pixelbits смысл? Я должен добавить этот var defer = $ q.defer(); ? затем сделайте это отсрочкой. Я искал статьи, которые могут мне помочь, и я нашел это https://thinkster.io/egghead/promises – user3714598

+0

Я не думаю, что 302 - это код состояния ошибки. Ошибки 4xx и 5xx – Chandermani

ответ

0

Вы код должен быть, как это вы пропустили обещание объект

app.factory('myHttpResponseInterceptor', ['$q', '$location', function($q, $location) { 
    return function(promise) { 
     var success = function(response) { 
      if (response.status === 302) { 
       alert("success " + response.status); 
       $location.path('/login.html'); 
       return response; 
      } else { 
       alert("success " + response.status); 
       return response; 
      } 
     }; 

     var error = function(response) { 
      if (response.status == 401) { 
       if (response.status === 302) { 
        alert("error " + response.status); 
        $location.path('/public/login.html'); 
        return $q.reject(response); 
       } else { 
        alert("error " + response.status); 
        return $q.reject(response); 
       } 

      } 

      return $q.reject(response); 
     }; 

     return promise.then(success, error); 
    }; 
}]); 

//Http Intercpetor to check auth failures for xhr requests 
app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('myHttpResponseInterceptor'); 
}]); 

См this link

+0

Ваш переписанный код имеет проверку, которая не имеет смысла «if (response.status == 401) {if (response.status === 302) ...» даже с учетом == vs == = сравнение Я не думаю, что это может быть и то, и другое ... Можете ли вы объяснить? – RonnBlack

-1

Вы должны использовать перехватчики Иногда вам может понадобиться изменить HTTP-запросов и ответов. Это может быть связано с различными причинами, такими как добавление глобальной логической обработки ошибок HTTP. С помощью перехватчиков вы можете легко выполнить это в своих угловых приложениях.

см это: https://egghead.io/lessons/angularjs-using-angularjs-interceptors-with-http

см Также этот аналогичный пост AngularJS using an interceptor to handle $http 404s - promise not defined error

Смежные вопросы