我正在执行http.post请求,并且在出现任何错误的情况下尝试显示错误消息。我正在处理服务中的错误消息,然后将其传递给控制器并在$ scope中进行设置。我没有收到任何JS错误...。为什么会有这样的想法?
services.js
angular.module('app.services', [])
.factory('Model', function($http) {
Model.save = function(data) {
return $http.post(url, data)
.success(function(data, status, headers) {
console.log(data);
console.log(status);
console.log(headers);
})
.error(function(data, status, headers) {
var requestError = 'Something went wrong! :(';
return requestError; //pass error message back to $scope
});
}
return Model;
});
controllers.js
.controller('Ctrl', function($scope, Model) {
//form object data
$scope.formInfo = {};
//form save
$scope.saveData = function() {
//console.log($scope.formInfo);
$scope.requestError = '';
//form data
var data = {name: $scope.formInfo.name, description: $scope.formInfo.description, token: "/api/v1/tokens/1/"};
Model.save(data).then(function(requestError) {
alert(requestError);
if (requestError === '') {
//do nothing for now
}
else {
$scope.requestError = requestError;
}
});
};
})
一个承诺有两个最终状态:已解决(成功)或被拒绝(错误)。
在控制器中,then()
如果要访问两个状态,则该函数需要两个不同的处理程序。第一个处理程序仅从服务接收已解决(成功)的承诺。为了还处理服务中被拒绝(错误)的承诺,您将需要以下内容:
Model.save(data).then(function(success) { ... }, function(error) { ... });
如果您仅出于某种原因关心错误,请使用以下两种方法之一(等效):
Model.save(data).then(null, function(error) { ... });
Model.save(data).catch(function(error) { ... });
在您的服务中,请确保在发生错误的情况下实际上已将被拒绝(错误)的承诺返回给控制器。您可以使用return $q.reject(requestError)
而不是来做到这一点return requestError
。
重要说明:由于您正在使用$http
,因此在HTTP错误的情况下,这将已经拒绝了Promise。如果您不处理服务中被拒绝(错误)的承诺,它们将自动传递给控制器的错误处理程序。您可能只想让我们$http
的拒绝通过,而在服务中没有错误处理程序。您可以通过简单地删除.error()
服务来做到这一点。这允许HTTP错误直接由控制器处理。(这可能不希望如此,这取决于您要执行哪种错误处理)。
我倾向于在HTTP服务中遵循的基本模式如下所示,该模式要么返回带有已下载数据的已解决承诺,要么返回$http
直接来自控制器的拒绝承诺(错误):
return $http.get(config).then(function(success) { return success.data });
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句