2015-11-30 4 views
1

У меня есть служба, которая интегрируется с внешним API. Этот API несовместим и вряд ли изменится.Обработка ошибок при 200 HTTP-ответе с использованием перехватчиков

Внутри API есть 2 метода сообщения об ошибке, один ответ с кодом HTTP 500, другой нормальный ответ 200 HTTP, но с status в JSON установлен на «ошибка».

Handling 500 ошибок работает нормально, я только что создал перехватчик (ngResource перехватчик, а не $ HTTP один) с responseError метод, который будет отображать сообщение об ошибке для пользователя, когда есть какие-либо 500 ответа от API:

.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) { 
    return { 
     responseError: function(response) { 
      console.log(response); 
      var error_dialog = ngDialog.open({ 
       template: '/api/error.html', 
       className: 'error', 
       preCloseCallback: function() { 
        if (response.data.status == 'fatal') { 
         window.location.href = '/'; 
        } else if (response.data.status == 'error') { 
         var dialogs = ngDialog.getOpenDialogs(); 
         for (var i in dialogs) { 
          var dialog = dialogs[i]; 
          if (dialog != error_dialog.id) { 
           ngDialog.close(dialog); 
          } 
         } 
        } 
       }, 
       data: { 
        code: response.data.code, 
        status: response.data.status, 
        message: response.data.message, 
        httpCode: response.status, 
       } 
      }); 
     }, 
    } 
}]) 
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) { 
    return $resource('/api/method/', {}, { 
      query: {method:'POST', interceptor: ApiErrorHandling}, 
    }); 
}]) 

Но у меня проблема с обработкой ошибок с status. Я не хочу, чтобы обратный вызов нормального успеха (переданный в метод из экземпляра ресурса) вызывался при возникновении ошибки, я хочу, чтобы один глобальный обработчик ошибок, но ничего не пробовал до сих пор. Каждый раз, когда ответ передается в обратный вызов. Я пытался до сих пор:

  • возвращение $ q.reject в response методе из перехватчика
  • изменения коды состояния в ответ на 500 внутри response метода от перехватчика
  • изменения или удаления response.resource в response методе от перехватчика

Идеальное решение будет, когда не будет вызван нормальный обратный вызов, но вместо этого будет называться мой метод responseError от перехватчика.

ответ

2

Но у меня есть проблема с обработкой ответов об ошибках со статусом. Я не хочу, чтобы обратный вызов нормального успеха (переданный в метод из экземпляра ресурса) вызывался при возникновении ошибки, я хочу, чтобы один глобальный обработчик ошибок, но ничего не пробовал до сих пор. Каждый раз, когда ответ передается в обратный вызов. Я пытался до сих пор:

возвращение $ q.reject в методе ответа от перехватчика

Чтобы отклонить ответ вам не нравится, используйте throw:

function inteceptor(httpPromise) { 
    var newPromise = (httpPromise 
     .then(function(response) { 
        if (dontLike) { 
         throw response; 
        } else { 
         return response; 
       }, 
       function (eResponse) { 
        if (iLike) { 
         return eResponse; 
        } else { 
         throw eResponse; 
        }; 
       }) 
    ); 
    return newPromise; 
}; 

Для цепи от вашего перехватчика

var chainedPromise = (interceptor(httpPromise) 
    .then (function (response) { 
     //render data 
     return response; 
    }).catch (function (error) { 
     console.log(error); 
     throw error; 
    }) 
); 
+0

Как я могу поймать эту заброшенную ошибку? – GwynBleidD

1

Я нашел решение. Я думаю, что некоторые ошибки в модуле ngResource.

После регистрации для обратного вызова, как это:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) { 
    something... 
}); 

Только решение для предотвращения вызова обратного вызова бросает ошибку из ngResource перехватчика. Но когда обратный вызов зарегистрирован в обещании:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) { 
    something... 
}); 

Вызова обратного вызова можно предотвратить только путем возвращения $q.reject из перехватчика.

Переназначение всей регистрации обратного вызова устраняет проблему.