Javascript 为什么我在AngularJS工厂使用.then()时没有得到正确的响应/错误?
我在Angular中有一个工厂,如果遇到错误,我想在这里添加一个警报 这是我给工厂的电话:Javascript 为什么我在AngularJS工厂使用.then()时没有得到正确的响应/错误?,javascript,angularjs,spring,Javascript,Angularjs,Spring,我在Angular中有一个工厂,如果遇到错误,我想在这里添加一个警报 这是我给工厂的电话: gradeService.assignGrade(requestData).then(Controller.populateResponseObject, Controller.error); app.factory('gradeService', function ($http) { var baseUrl = "http://localhost:8080"; var add =
gradeService.assignGrade(requestData).then(Controller.populateResponseObject, Controller.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);
};
return {
assignGrade: add
};
});
其中,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
};
});
以下是相关的错误代码:
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',函数($http){
var baseUrl=”http://localhost:8080";
var add=函数(请求){
var requestUrl=baseUrl+“/grade/new”;
返回$http.post(requestUrl,request);
};
返回{
分配等级:添加
};
});代码>您的问题是在assignGrade()/add()函数中没有返回承诺,而是返回响应数据。这意味着Angular不会做出正确的承诺处理
只需执行以下操作,您的处理就会正常工作:
app.factory('gradeService',函数($http){
var baseUrl=”http://localhost:8080";
var add=函数(请求){
var requestUrl=baseUrl+“/grade/new”;
返回$http.post(requestUrl,request);
};
返回{
分配等级:添加
};
});代码>您必须在未使用的控制器中处理承诺
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 obj = {}
var baseUrl = "http://localhost:8080";
obj.add = function (request) {
var requestUrl = baseUrl + "/grade/new";
return $http.post(requestUrl, request);
};
return obj;
});
我认为上面的代码可以解决您的问题。首先,修改工厂:
gradeService.assignGrade(requestData).then(Controller.populateResponseObject, Controller.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);
};
return {
assignGrade: add
};
});
然后,像这样给工厂打电话:
gradeService.assignGrade(requestData).then(function(success) {
// Some success code...
}, function(error) {
// Some error code...
});
首先,修改工厂:
gradeService.assignGrade(requestData).then(Controller.populateResponseObject, Controller.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);
};
return {
assignGrade: add
};
});
然后,像这样给工厂打电话:
gradeService.assignGrade(requestData).then(function(success) {
// Some success code...
}, function(error) {
// Some error code...
});
若要链接一个错误,将其抛出回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处理程序返回某物会将派生的承诺转换为已实现的承诺
有关详细信息,请参阅。到链一个错误,将其抛出回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处理程序返回某物会将派生的承诺转换为已实现的承诺
有关更多信息,请参阅。您是否尝试过:return$http.post(requestUrl,request).success(函数(responseSuccess){return responseSuccess.data;}).error(函数(responseError){return responseError.data;});}代码>@comoss不推荐使用。你说得对@使用.success
和.error
方法忽略返回值。这是它们被弃用的原因之一。对于未来的读者:对控制器中的返回值执行console.log()
,应该可以弄清楚这里发生了什么。如果您在日志中得到一个Promise{…}
,则会返回该承诺。但是,如果您在服务中解决了承诺,那么您将只得到一个对象{…}
,并且再次对其执行。然后()
,将出现“非函数”错误(显然)。您是否尝试过:返回$http.post(requestUrl,request)。成功(函数(responseSuccess){return responseSuccess.data;}).error(函数(responseError){return responseError.data;});}代码>@comoss不推荐使用。你说得对@使用.success
和.error
方法忽略返回值。这是它们被弃用的原因之一。对于未来的读者:对控制器中的返回值执行console.log()
,应该可以弄清楚这里发生了什么。如果您在日志中得到一个Promise{…}
,则会返回该承诺。但是,如果您在服务中解析了承诺,那么您将只得到一个对象{…}
,并且再次对其执行。然后()
将给您带来“非函数”错误(显然)。如果您想在外部处理结果,那么不是:)。然后()将解析您的承诺,因此以后您将无法处理它。另一种可能是在工厂处理您的错误。然后,您需要在当前返回*.data的位置执行成功/错误处理程序…感谢您的帮助。顺便问一下,是否只有特殊类型的方法(如post
)我没有使用Then
?为get
执行此操作会导致服务返回undefined
。由于$http.post()方法返回一个承诺,因此可以对其调用then()。如果在返回之前已解决该问题,则会出现错误。如果要在外部处理结果,则不:)。然后()将解决您的承诺,因此以后将无法处理该问题。另一种可能是在工厂处理您的错误。然后,您需要在当前返回*.data的位置执行成功/错误处理程序…感谢您的帮助。顺便问一下,是否只有特殊类型的方法(如post
)我没有使用Then
?为get
执行此操作会导致服务返回undefined
。由于$http.post()方法返回一个承诺,因此可以对其调用then()。如果您在返回之前已经解决了它,那么您将得到错误。