2014-09-03 3 views
4

До сих пор у меня есть около 4 звонков на мой API с использованием Restangular и в каждом из них я проверка для них на втором аргументе, то, как показано ниже:Общие обработчик ошибок для Restangular

Restangular.all("accounts").getList().then(function() { 
    console.log("All ok"); 
}, function(response) { 
    console.log("Error with status code", response.status); 
}); 

Как вы можете видеть, это не поддерживаемый подход, так как это создает много повторяющегося кода обработки ошибок в приложении.

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

Я надеюсь, что, возможно, некоторые новые идеи помогут мне в этом вопросе.

Спасибо :)

ответ

2

У меня была аналогичная проблема. Проблема с errorInterceptor заключается в том, что она вызывается перед любыми обратными вызовами, поэтому у нас есть возможность делать что-то всегда не только тогда, когда нам это нужно. Я решил эту проблему хакерским способом, поэтому вам решать, будете ли вы использовать ее в своем коде или нет. Прекрасно работает на:

"angular": "1.3.0", 
"restangular": "1.4.0", 

Сначала я использовать errorInterceptor:

RestangularConfigurer.setErrorInterceptor(function (response, deferred, responseHandler) { 
    var hasSomeErrback = deferred.promise.$$state.pending.map(function (thenAttachment) { 
     if (thenAttachment[2]) { 
      return true 
     } 
     else { 
      return false 
     } 
    }).reduce(function (accumulator, value) { 
     return accumulator || value 
    }, false) 

    if (!hasSomeErrback) { 
     myErrorService.globalError() 
    } 
}) 

Но вместо вызова глобального обработчика ошибок (myErrorService.globalError()) каждый раз, когда я делаю это только тогда, когда не ошибка обратного вызова зарегистрировано. Это вполне Hacky, так как он использует INTERAL данные объекта обещают, но, кажется, работает, см тесты:

describe('when server responded with error', function() { 
    beforeEach(function() { 
     spyOn(myErrorService, 'globalError') 
     $httpBackend.whenGET('/api/evil').respond(500, 'pure evil') 
    }) 

    it('should call global error handler if error callback was NOT attached', function() { 
     myApiClient.all('evil').getList().then(function() { 

     }) 

     $httpBackend.flush() 

     expect(myErrorService.globalError).toHaveBeenCalled() 

    }) 

    it('shouldnt call global error handler if error callback was attached', function() { 
     myApiClient.all('evil').getList().then(function() { 

     }, function() { 
      console.log('Inside local catch') 
     }) 

     $httpBackend.flush() 

     expect(myErrorService.globalError).not.toHaveBeenCalled() 
    }) 

    it('shouldnt call global error handler if error callback was attached using catch', function() { 
     myApiClient.all('evil').getList().catch(function() { 

     }) 

     $httpBackend.flush() 

     expect(myErrorService.globalError).not.toHaveBeenCalled() 
    }) 
}) 
+0

скопирован с HTTP- : //www.ngroutes.com/questions/AUuADiQ_a5vEqxqlK7FY/general-error-handler-for-restangular.html –

4

Вместо проверить у нас есть конкретный обработчик ошибок в обещании цепи или нет, я добавил мой генерал обработчик ошибок быть сократимое позже обетования цепи:

Restangular.setErrorInterceptor(
     function(response, deferred, responseHandler) { 
      var generalHandlerTimer = $timeout(function(){ 
       generalErrorHanding(response); 
      },1); 
      response.cancelGeneralHandler = function(){ 
       $timeout.cancel(generalHandlerTimer); 
      }; 
      return true; // continue the promise chain 
     } 
); 

и вызова, где может произойти ошибка:

restangularizedUser.patch({ 
      user: { 
      email:newValue 
      } 
     }).then(function(res) { 
       //Success 
      }, function(response) { 
       //Error 
       //Cancel the general error handler due to I want to handle it on my way 
       response.cancelGeneralHandler(); 
       $log.debug('Handle the ERROR on my specific way'); 
     }); 

Недостатки:

  • Если вам нужно использовать конкретный обработчик ошибок, то вам необходимо вызвать response.cancelGeneralHandler();

Преимущество:

  • Нет хак не требуется :)
Смежные вопросы