为什么我在使用 .then() 的 AngularJS 工厂中没有得到正确的响应/错误

Why am I not getting proper response/error in AngularJS factory using .then()?

本文关键字:错误 响应 工厂 then AngularJS 为什么      更新时间:2023-09-26

我在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...
});