在我的 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;
};