我在Angular有一家工厂,如果遇到错误,我想在那里添加警报。
这是我给工厂的电话:
gradeService.assignGrade(requestData).then(Controller.populateResponseObject, Controller.error);
其中Controller
只是当前控制器的一个:var Controller = this
。
当我尝试在UI中触发错误时,会遇到500服务器错误(正如预期的那样),但会转到populateResponseObject
,而不是error
。如何让服务返回错误?
这是服务代码:
app.factory('gradeService', function ($http) {
var baseUrl = "http://localhost:8080";
var add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request)
.then(function (responseSuccess) {
return responseSuccess.data;
},
function (responseError) {
return responseError.data;
});
};
return {
assignGrade: add
};
});
以下是相关的error
代码:
Controller.error = function (error) {
// ... some code
else if(error.status === 500) {
if(error.exception === "org.springframework.dao.DataIntegrityViolationException") alert("Error: this person has already been graded for this month. Grade was not saved.");
else if(error.exception === "java.sql.SQLException") alert("Error establishing connection with database. Please try again later.");
else alert("Error: " + error.message + ": Generic Server Error.");
}
};
我使用Spring作为后端代码。
任何帮助?
答案 0 :(得分:1)
您的问题是您没有在assignGrade()/ add()函数中返回promise,而是返回响应数据。这意味着Angular将没有正确的承诺处理。
只需执行以下操作,然后您的处理就可以正常工作:
app.factory('gradeService', function ($http) {
var baseUrl = "http://localhost:8080";
var add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request);
};
return {
assignGrade: add
};
});

答案 1 :(得分:1)
链错误,抛出回到onRejected函数。
app.factory('gradeService', function ($http) {
var baseUrl = "http://localhost:8080";
var add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request)
.then(function onFulfilled(responseSuccess) {
return responseSuccess.data;
},
function onRejected (responseError) {
//to chain rejection throw it
throw responseError;
//Not return
//return responseError.data;
});
};
return {
assignGrade: add
};
});
从onRejected处理程序返回某些内容将派生的承诺转换为已履行的承诺。
有关详细信息,请参阅Angular execution order with $q
。
答案 2 :(得分:0)
您必须在未使用的控制器中处理承诺。
app.factory('GradeService', function ($http) {
var obj = {}
var baseUrl = "http://localhost:8080";
obj.add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request);
};
return obj;
});
我认为上面的代码将解决您的问题。
答案 3 :(得分:0)
首先,修改工厂:
app.factory('gradeService', function ($http) {
var baseUrl = "http://localhost:8080";
var add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request);
};
return {
assignGrade: add
};
});
然后,像这样打电话给工厂:
gradeService.assignGrade(requestData).then(function(success) {
// Some success code...
}, function(error) {
// Some error code...
});