1

在我的 Angular 控制器中,我有 4 个属性,它们都涉及对我的工厂的调用,这些调用使用 angulars $q 返回承诺。

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

我想等到前两个异步调用返回后再执行第三个,然后必须在执行最后一个之前返回。我之前已经有了这个我正在创建的演示应用程序,它与 pub/sub 一起很好地协调它,但我决定转换为 Angular 以了解有关它如何工作的更多信息。

这是我的控制器代码。基本上锦标赛名称,锦标赛钱包需要在我设置锦标赛结果之前设置(因为它需要知道钱包),然后在所有设置之后我需要设置选秀权(它使用结果在高尔夫球池风格应用程序中为球员选秀评分) .

demoApp.controller('SimpleController', function ($scope, simpleFactory) {
    $scope.tournamentName = '';
    $scope.tournamentPurse = '';
    $scope.tournamentResults = [];
    $scope.picks = [];

    init();
    function init() {
       $scope.tournamentName = simpleFactory.getTournamentName();
       $scope.tournamentPurse = simpleFactory.getTournamentPurse();
       $scope.tournamentResults = simpleFactory.getTournamentResults();

       $scope.picks = simpleFactory.getPicks();
    }

});

这是我的工厂方法之一的代码,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;
    };
4

1 回答 1

2

将 $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
});
于 2013-06-29T11:50:39.227 回答