2014-10-21 2 views
1

У нас есть API-интерфейсы, которые возвращают ошибки внутри XML-ответов, вместо того, чтобы отклонять их и отправлять ответы об ошибках. Поэтому у меня есть следующий код, чтобы справиться с ними,HTTPInterceptor in AngularJS

   $http({ 
        url: apiURL, 
        method: "POST", 
        data: req, 
        headers: oHeaders, 
        dataType: "xml", 
       }) 
       .success(function(data,status) { 
        console.log('success!!!!!'); 
        deff.resolve(data); 
       }) 
       .error(function(data,status) { 
        console.log('This is what I want to see!!!!!'); 
        deff.reject(data); 
       }); 


myApp.factory('customHttpInterceptor', ['$q', function ($q) { 
    return function (promise) { 
     return promise.then(function (response) { 
      var parsed; 
      if (response.config.dataType == 'xml'){ 
       parsed = $.xml2json(response.data); 
       if (parsed) { 
        angular.forEach(parsed, function(v, k) { 
         if (k == 'status') { 
          if (v.APIErrors) { 
           return $q.reject(response); 
          }  
         }       
        });      
       } 
       console.log(parsed); 
      } 
      return response; 
     }, function (errResponse) { 
      // do something on error 
      console.log('Error section in interceptor'); 
      return $q.reject(errResponse); 
     }); 
    }; 
}]);  

То, что я ожидал получить от том, что при возникновении ошибки определены в перехватчик будет отвергать обещание и контроль будет попасть в раздел ошибок из $ http и запишите «Это то, что я хочу видеть !!!!!» сообщение. Но вместо этого демонстрируется «успех !!!!!» сообщение.

Это так, как это работает, или я делаю что-то неправильно?

Иш

ответ

1

Я вижу несколько вещей, которые, кажется, здесь не так:

возвращающая результат в forEach

angular.forEach(parsed, function(v, k) { 
    if (k == 'status') { 
    if (v.APIErrors) { 
     return $q.reject(response); 
    } 
    } 
}); 

Вы, вероятно, написал это потому, что вы привыкли ставить return заявления внутри для петель. Это не работает здесь, потому что вы возвращаетесь из тела функции. Существует never любая причина возвращать что-то в функции forEach body: это значение ни в коем случае не будет использоваться.

Угловая перехватчик API

Может быть, вы просто не показать его в своем коде, но вы должны зарегистрировать свой перехватчик.

$httpProvider.interceptors.push('customHttpInterceptor'); 

Более того, ваш перехватчик не имеет правильную форму: в вашем случае, это должен быть объект с response метода, который возвращает обещание ответа от ответа.

+0

Спасибо. Проблема действительно возвращалась внутри forEach. – Ish