2014-09-23 7 views
0

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

Вот мой код поставщика:

function myPvdr() { 
    this.getUrl = function() { 
    return 'http://path/to/my/API'; 
    }; 
    this.$get = function($q, $http) { 
    var self = this; 
    return { 
     getData: function(points) { 
     var d = $q.defer(); 
     $http({ 
      method: 'GET', 
      url: self.getUrl(), 
      cache: true 
     }).success(function(data) { 
      d.resolve(data); 
     }).error(function(err) { 
      d.reject(err); 
     }); 
     return d.promise; 
     } 
    } 
    } 
} 

А вот как я использую его в мой контроллер:

function myCtrl($scope, myProvider, localStorageService) { 
    $scope.myData = localStorageService.get('data') || {}; 

    myProvider.getData() 
    .then(function(data) { 
     localStorageService.set('data', data); 
     $scope.data = data; 
    }); 
} 

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

Большое спасибо

+0

Это эффективно агностически для Углового. Закрыто как дубликат вопроса обработки ошибок. Также, пожалуйста, подумайте о том, чтобы отложить отложенный шаблон и как его избежать. Весь ваш getdata также мог бы быть 'return $ http.get (...', поскольку $ http уже возвращает обещания. –

ответ

0

var app = angular.module('app', []); 
 

 

 

 
function myProvider($http, $q) { 
 
    this.getUrl = function() { 
 
    return 'http://path/to/my/API'; 
 
    }; 
 
    
 
     
 
    this.getdata = function(points) { 
 
     var d = $q.defer(); 
 
     $http({ 
 
      method: 'GET', 
 
      url: this.getUrl(), 
 
      cache: true 
 
     }).then(function(data) { 
 
      d.resolve(data); 
 
     },function(err) { 
 
      d.reject(err); 
 
     }); 
 
     return d.promise; 
 
     
 
    }; 
 
    return this; 
 
} 
 
app.factory('myProvider', myProvider); 
 
app.controller('firstCtrl', function($scope,myProvider){ 
 
    
 
// $scope.myData = localStorageService.get('data') || {}; 
 

 
    getdata = function() { 
 
     
 
    myProvider.getdata() 
 
    .then(function(data) { 
 
     localStorageService.set('data', data); 
 
     $scope.data = data; 
 
    }, 
 
     //handle error 
 
     function(e){ 
 
     alert("Error " + e.status); 
 
     
 
     
 
    }); 
 
    }; 
 
    getdata(); 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<body ng-app="app"> 
 
    <div ng-controller="firstCtrl"> 
 

 
     </div> 
 
</body>

1

Вы можете поймать отказаться от обещания, как это:

myProvider.getData() 
.then(function(data) { 
    // promise resolved, data treatment 
}, function(error) { 
    // promise rejected, display error message 
}); 

или

myProvider.getData() 
.then(function(data) { 
    // promise resolved, data treatment 
    }) 
.catch(function(error) { 
    // promise rejected, display error message 
    }); 
Смежные вопросы