为什么我在使用 .then() 的 AngularJS 工厂中没有得到正确的响应/错误
Why am I not getting proper response/error in AngularJS factory using .then()?
我在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 作为后端代码。
有什么帮助吗?
你的问题是你没有在assignGrade()/add()函数中返回一个承诺,而是返回响应数据。这意味着 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
};
});
要链接错误,请将其扔回 onReject 函数。
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
};
});
从 onReject 处理程序返回某些内容会将派生的承诺转换为已实现的承诺。
有关详细信息,请参阅带$q
的角度执行顺序。
您必须在控制器中处理承诺而不是在服务中。
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;
});
我认为上面的代码将解决您的问题。
首先,修改工厂:
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...
});
相关文章:
- 有没有任何方法可以从javascript进行跨域请求,并访问它可能生成的错误响应类型(401404等)
- 来自next()的Later.js错误响应
- 错误响应上的X-Frame-Options标头
- 无法将节点邮件程序错误响应从节点.js发送到角度.js
- 如何禁用基于 ajax 错误响应的元素
- 无法让模拟后端返回错误响应
- iOS Firefox XMLHttpRequest 错误响应
- 错误:调用 waitForCondition 时错误响应状态:13
- 添加对 jquery .submit() 的回调以读取上传的错误响应
- 为什么我的FB.api请求总是产生错误响应
- 如何在Jquery POST中获得HTTP错误响应代码?
- Javascript在读取cakephp发送的json服务器错误响应后表示未定义
- 如何在Angular上静默http错误响应
- 如何从PHP创建jqGrid JSON错误响应,然后使用jqGrid javascript对其进行响应?
- Javascript http get success函数捕获错误响应
- 在rails控制器中发回ajax错误响应
- 身份工具箱不工作-错误代码:IDP的错误响应
- 铁形式的错误响应体
- 如何在Ajax中获得错误响应
- 如何在ember js操作中获得龙卷风错误响应