私の Angular コントローラーには 4 つのプロパティがあり、すべてが angulars $q を使用して promise を返すファクトリへの呼び出しを伴います。
私は非同期と約束の世界にかなり慣れていないので、これは解決するのが簡単な問題かもしれませんが、ここに私が直面している問題があります。
最初の 2 つの非同期呼び出しが返されるまで待ってから 3 番目を実行し、最後の呼び出しを実行する前に返さなければなりません。私が作成しているこのデモアプリは、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();
}
});
そして、これは私のファクトリ メソッドの 1 つである 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;
};