Angular JS:Post调用是在Success和Error Method中进行的

时间:2017-02-13 13:34:45

标签: angularjs angularjs-directive angularjs-scope angular-ui-router

我知道在问这个问题时我看起来很愚蠢,但我无法弄清楚这一点。

我编写了一个服务来处理对服务器的post调用。 $q服务将promise返回给已调用服务的控制器函数。

服务:

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
    return {
        getSearchresultPost : function(url,data){
            var defer = $q.defer();
            $http.post(url, data)
            .then(function(data, status, header, config){
                defer.resolve(data);

            }).then(function(data, status, header, config){
                defer.reject(data);
            });
            return defer.promise;
        }
    };
}]);

控制器

app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
 AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
        .then(function(data){
            console.log("Data ",data);
        }).then(function(data){
            console.log("Some Error Occured");
        });
}]);

当我尝试运行代码时,我得到两个控制台都被打印出来。

我没有得到错误。有人帮忙吗?

3 个答案:

答案 0 :(得分:1)

将第二个“然后”更改为“catch”,应该解决这个问题。在这两种情况下都必须这样做。

    app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
 AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
        .then(function(data){
            console.log("Data ",data);
        }).catch(function(data){
            console.log("Some Error Occured");
        });
}]);

更新

同样如我所见,您使用的是$ http,请检查here

答案 1 :(得分:1)

您可以更改服务并在$ http.post中传递第二个参数(错误函数)(文档:https://docs.angularjs.org/api/ng/service/$http):

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
    return {
        getSearchresultPost : function(url,data){
            var defer = $q.defer();
            $http.post(url, data)
            .then(function(data, status, header, config){
                defer.resolve(data);

            }, function(error, status, header, config){
                defer.reject(error);
            });
            return defer.promise;
        }
    };
}]);

在你的控制器中你也可以传递第二个参数:

app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){
 AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall)
        .then(function(data){
            console.log("Data ",data);
        }, function(error){
            console.log("Some Error Occured", error);
        });
}]);

答案 2 :(得分:0)

由于$ http服务已经返回一个承诺,因此无需使用$q.defer制作承诺:

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) {
    return {
        getSearchresultPost : function(url,data){
            //var defer = $q.defer();
            var promise = $http.post(url, data)
            //.then(function(data, status, header, config){
            .then(function (response) {
                var data = response.data;
                //defer.resolve(data);
                //return data to resolve
                return data;    
            //}).then(function(data, status, header, config){
            }).catch(function(response) {
                var data = response.data;
                //defer.reject(data);
                //throw data to reject with value
                throw data;
            });
            //return defer.promise;
            return promise;
        }
    };
}]);

另请注意,.then.catch方法使用response对象调用其函数,而不是data但返回(或抛出)data属性处理程序创建一个新的promise,用该值解析(或拒绝)。

AjaxService.getSearchresultPost(url,pathToCall)
    .then(function(data){
        console.log("Data ",data);
    //}).then(function(data){
    }).catch(function(data) {
        console.log("Some Error Occured");
    });

有关详细信息,请参阅AngularJS $q Service API Reference - Chaining Promises