当使用“then”时,工厂中的Http函数无法在控制器中工作

时间:2017-10-11 13:17:21

标签: angularjs

我试图在控制器中调用Factory的http函数,当我使用.then时它不起作用 我的代码如下:

模块:

var brandlistmodule = angular.module('newApp')

工厂:

brandlistmodule.factory('BrandListFactory',["$http","$routeParams",function($http,$routeParams){
    console.log(2)
    return {
        a: function(response){
            console.log('1');
             return $http.get("/restful_api/category_1/?format=json").then(function(response){
                 console.log('3');
                  return response.data;
             });

        },
        b: function(response){
             return $http.get("/restful_api/category_refer_a/?format=json").then(function(response){
                  return response.data;
             });

        },
        c: function(response){
             return $http.get("/restful_api/brand_test_search/?format=json").then(function(response){
                  result = response.data
                  return result;
             });

        },

    }

}])

控制器:

brandlistmodule.controller('brandlistCtrl', ['BrandListFactory','$scope','$rootScope','$http',function (BrandListFactory,$scope,$rootScope,$http) {
        $scope.$on('$viewContentLoaded', function () {
        $rootScope.category = function(){
         BrandListFactory.a.success(function(data){
             console.log('9');
             $rootScope.category =data 
         });

     };

在控制台中它只能显示“2”,如果我按如下方式更改控制器,它将正常工作

brandlistmodule.controller('brandlistCtrl', ['BrandListFactory','$scope',function (BrandListFactory,$scope) {
    $scope.$on('$viewContentLoaded', function () {
   BrandListFactory.BrandCategoryList()

2 个答案:

答案 0 :(得分:1)

你的问题是你在工厂内调用Then()......所以你可以做的是:

1 - 不要打电话......但是将所有$ http请求退回给工厂的来电者......如:

brandlistmodule.factory('BrandListFactory',["$http","$routeParams",function($http,$routeParams){
    console.log(2)
    return {
        a: function(response){
            console.log('1');
             return $http.get("/restful_api/category_1/?format=json");

        },
        b: function(response){
             return $http.get("/restful_api/category_refer_a/?format=json");

        },
        c: function(response){
             return $http.get("/restful_api/brand_test_search/?format=json");

        },

    }

}])

2-使用$ q并自己制作asyncron链..像:

brandlistmodule.factory('BrandListFactory',["$http","$routeParams","$q",function($http,$routeParams,$q){
    console.log(2)
    return {
        a: function(response){
var deferred = $q.defer();
            console.log('1');
             return $http.get("/restful_api/category_1/?format=json").then(function(response){
                 console.log('3');
                 deferred.resolve( response.data);
             }).catch(function(err){
deferred.reject(err);
});

return deffered.promise;

        } 
// and same for others
    }

}])

答案 1 :(得分:0)

我建议创建一个负责所有http调用的服务

.service('HttpService', ['$rootScope', '$http', 'Ls', 'CommonService', 'DateService', function ($rootScope, $http, Ls, CommonService, DateService) {
        return {
            CallService: function (url, callback) {                   
                $http.get(url)
                    .success(function (data, status) {                            
                        callback(data, status);
                    }).error(function (data, status) {
                        callback(data, status);
                    });                 
            } 
        }
    });

如果您将参数回调传递到HttpService.CallService,那么您可以在success来电的errorhttp.get函数中调用回调。

例如在Controller中你可以做到

    HttpService.CallService('/restful_api/category_refer_a/?format=json', function (data) {
                        console.log(data)
                        //do something with your data

    });

所以在你的例子中你可以做到:

 $scope.$on('$viewContentLoaded', function () {
             HttpService.CallService('/restful_api/category_refer_a/?format=json', function (data) {
                            console.log('9');
                 $rootScope.category =data 

        });
});

或者您只是将来电更改为

b: function(callback){
             return $http.get("/restful_api/category_refer_a/?format=json").then(function(response){
                  callback(response.data);
             });

        },

BrandListFactory.b(function(data){
             console.log('9');
             $rootScope.category =data 
         });

希望这有助于你