Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我在AngularJS工厂使用.then()时没有得到正确的响应/错误?_Javascript_Angularjs_Spring - Fatal编程技术网

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

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 =

我在Angular中有一个工厂,如果遇到错误,我想在这里添加一个警报

这是我给工厂的电话:

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()。如果您在返回之前已经解决了它,那么您将得到错误。