1

私の 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;
    };
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 に答える