Angular$q返回promise两次$http服务调用

Angular $q returning promise twice $http service call

本文关键字:http 服务 调用 两次 promise 返回 Angular      更新时间:2023-09-26

我是一个非常新的angular js,在这里尝试为默认加载数据创建服务。我的当前函数在每个api URL上循环,并将每个URL推送到一个数组中,然后推送。我有一个功能正常的返回数组,需要将其压平。为什么它被记录了两次?

cat.service('defaultload', [ '$http', '$q', '$rootScope',function($http, $q, $rootScope){
    this.getdefaultload = function(){
        var deferred = $q.defer();
        var defaulturl = ["/cat_questionWithAnswers", "/cat_user_template", "/cat_evaluation", "/cat_newForm", "/cat_sub_key_template_1"];
        var collectdefaultdata = [];
        angular.forEach(defaulturl, function(url, index){
            console.log( $rootScope.serviceURL + url + " ---- "+ index);
            collectdefaultdata.push($http.get($rootScope.serviceURL+url));
        });
        $q.all(collectdefaultdata).then(function(results){
        deferred.resolve(JSON.stringify(results));
        console.log(JSON.stringify(results, null, 2));
    });
    return deferred.promise;
    }
}]);
cat.controller('Loginctrl', ['$scope', '$rootScope','$state','$log','$http','defaultload', function($scope, $rootScope, $state, $log, $http, defaultload){
    $rootScope.serviceURL = 'https://dummy.com';
    defaultload.getdefaultload();
}]);

您正在加倍使用promise$http已经是一个承诺,$q.all 也是如此

cat.service('defaultload', [ '$http', '$q', '$rootScope',function($http, $q, $rootScope){
    this.getdefaultload = function(){
        var defaulturl = ["/cat_questionWithAnswers", "/cat_user_template", "/cat_evaluation", "/cat_newForm", "/cat_sub_key_template_1"];
        var collectdefaultdata = [];
        angular.forEach(defaulturl, function(url, index){
            console.log( $rootScope.serviceURL + url + " ---- "+ index);
            collectdefaultdata.push($http.get($rootScope.serviceURL+url));
        });
        return $q.all(collectdefaultdata);
    }
}]);

然后你可以在你的控制器中使用它

cat.controller('Loginctrl', ['$scope', '$rootScope','$state','$log','$http','defaultload', function($scope, $rootScope, $state, $log, $http, defaultload){
    $rootScope.serviceURL = 'https://dummy.com';
    defaultload.getdefaultload()
    .then(function(results) {...}));
}]);

简单的服务示例

.service("functionName",function($http,$q) {
   var abcObject = {}; //name of object you wanted to return
   var abc; //you can use $scope.abc
   abcObject.getValues = function () {
      var d = $q.defer(); //A new instance of deferred is constructed by calling $q.defer().
      $http.get('api.json').then(
         function success(response) {
            abc = response.data; // store the response into the abc
            d.resolve(abc); //return success
         },
         function failure(reason) {
            d.reject(reason);//return failure
         });
   return d.promise;//return result
   return abcObject;//return object of success or failure
});

控制器

.controller('CtrName', function(functionName){
   $scope.data = functionName.getValues();
});