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

时间:2016-03-01 07:18:44

标签: javascript angularjs spring

我在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作为后端代码。

任何帮助?

4 个答案:

答案 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...
});