Javascript 在angular controller中,如何在初始化另一个属性之前获得多个要初始化的异步属性

Javascript 在angular controller中,如何在初始化另一个属性之前获得多个要初始化的异步属性,javascript,asynchronous,angularjs,Javascript,Asynchronous,Angularjs,在我的Angular控制器中,我有4个属性,所有属性都涉及到使用angulars$q返回承诺的工厂调用 我对异步和承诺的世界是相当陌生的,所以这可能是一个很容易解决的问题,但这是我面临的问题 我希望在执行第三个异步调用之前等待前两个异步调用返回,然后在执行最后一个异步调用之前必须返回。我已经有了这个演示应用程序,我正在创建一个与pub/sub很好地协作的应用程序,但我决定转换为Angular,以了解它的工作原理 这是我的控制器代码。基本上,tournamentName、Tournament钱包需

在我的Angular控制器中,我有4个属性,所有属性都涉及到使用angulars$q返回承诺的工厂调用

我对异步和承诺的世界是相当陌生的,所以这可能是一个很容易解决的问题,但这是我面临的问题

我希望在执行第三个异步调用之前等待前两个异步调用返回,然后在执行最后一个异步调用之前必须返回。我已经有了这个演示应用程序,我正在创建一个与pub/sub很好地协作的应用程序,但我决定转换为Angular,以了解它的工作原理

这是我的控制器代码。基本上,tournamentName、Tournament钱包需要在我设置tournamentResults(因为它需要知道钱包)之前设置好,然后在设置好之后,我需要设置选秀权(在高尔夫球池风格的应用程序中使用结果为球员选秀权打分)

下面是我的一个工厂方法getTournamentName的代码,它使用YQL获取名称

    factory.getTournamentName = function() {
        var deferred = $q.defer();

        var query = "SELECT * FROM html WHERE url='http://espn.go.com/golf/leaderboard' AND xpath=\"//h1[@class='tourney-name']\"";
        var encodedQuery = encodeURIComponent(query.toLowerCase()),
            url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodedQuery + '&format=json&callback=JSON_CALLBACK';

        $http({method: 'JSONP', url: url}).
            success(function(data) {
                var tournamentName = data.query.results.h1.content;
                deferred.resolve(tournamentName);
            });

        return deferred.promise;
    };

将$q服务注入控制器,代码如下所示

$q.all([simpleFactory.getTournamentName(), simpleFactory.getTournamentPurse()]) //Wait for both operations to complete
    .then(function (results) {
       $scope.tournamentName = results[0];
       $scope.tournamentPurse = results[1];
       return simpleFactory.getTournamentResults();
     })
    .then(function (results) {
    $scope.tournamentResults = results;
    $scope.picks = simpleFactory.getPicks();    //this assignment can be done in next then, if we return promise
});
$q.all([simpleFactory.getTournamentName(), simpleFactory.getTournamentPurse()]) //Wait for both operations to complete
    .then(function (results) {
       $scope.tournamentName = results[0];
       $scope.tournamentPurse = results[1];
       return simpleFactory.getTournamentResults();
     })
    .then(function (results) {
    $scope.tournamentResults = results;
    $scope.picks = simpleFactory.getPicks();    //this assignment can be done in next then, if we return promise
});