AngularJS $q.all 如何解析服务中的数据而不是控制器中的数据

AngularJS $q.all how to resolve data in service and not in controller

我重构了我的代码,以便所有模型创建都脱离控制器并在我的工厂内进行。这很好用,但现在我想确保在初始化时我的所有承诺都按顺序解决,因此尝试使用 $q.all returns 未定义项数组。我究竟做错了什么?这是我的代码:

//Data 1
{'name': 'a name'}
//Data 2
{'city': 'a city'}
//Data 3
{'car' : 'a car'}


var app = angular.module('app', []);

app.service('myHttpService', ['$http', '$q', function($http, $q){

    var DEFAULT_ERROR = "An error occurred while contacting the server.";

    return {
        myPromise : function(httpAction){
            var deferred = $q.defer();

            httpAction.success(function(data){
                deferred.resolve(data);

            }).error(function(reason){
                if(reason) {
                    if(typeof reason === 'object' && reason.err)
                        deferred.reject(reason.err);
                    else if(typeof reason === 'string')
                        deferred.reject(reason);
                    else
                        deferred.reject(DEFAULT_ERROR);
                }
                else
                    deferred.reject(DEFAULT_ERROR);
            });
            return deferred.promise;
        }
    }
}]);


app.factory('myService', function($http, $q, myHttpService) {
    return MyData = {
        getData1: getData1,
        getData2: getData2,
        getData3: getData3,
        getAllData: getAllData
    };


    function getData1() {
        return myHttpService.apiPromise($http.get('/api/data_1')).then(function(data1){
            MyData.data1 = data1;
        });
    }

    function getData2() {
        return myHttpService.apiPromise($http.get('/api/data_2')).then(function(data2) {
            MyData.data2 = data2;
        });
    }

    function getData3(){
        return myHttpService.apiPromise($http.get('/api/data_3')).then(function(data3) {
            MyData.data3 = data3
        });
    }

    function getAllData(promises) {
        return $q.all(promises).then(function(data) {
            MyData.allData = data;
        })

    }


});



app.controller('MyCtrl', function (myService) {
    var this = self;
    this.data1 = myService.getData1;
    this.data2 = myService.getData2;
    this.data3 = myService.getData3;
    this.allData = myService.getAllData;

    this.init = function() {
        //HOW DO I GET THIS
        myService.getData1().then() {
            self.data1 = myService.data1;
            myService.getData2().then() {
                self.data2 = myService.data2;
                myService.getData3().then {
                    self.data3 = myService.data3;
                }
            }
        }
        // INTO THIS??
        myService.getAllData([myService.getData1(), myService.getData2(), myService.getData3()]).then(function() {
            self.allData = myService.getAllData;
            console.log(self.allData);
            //EXPECT [{'name': 'my name'},{'city': 'my city'},{'car' : 'my car'}]
            //INSTEAD GET
            //[undefined, undefined, undefined]
        })

    }
});

在你的情况下 myService.getDataN() 不是承诺。每个 getDataN 也应该 return 里面的数据 then.

 ...
 function getData1() {
    return myHttpService.apiPromise($http.get('/api/data_1')).then(function(data1){
        MyData.data1 = data1;
        return data1;
    });
 }
 ...