3

この例でわかるように、AngularJSアプリケーションにpromiseを実装したいと思います: https ://stackoverflow.com/a/12360882/371273

私のアプリケーションは複数のデータ配列を取り、サーバー上で複数のデータベースヒットを引き起こしますが、アプリケーションを可能な限り効率的に保つためにリクエストを最小限に抑えるという考えで、すべてのデータを1つの応答として返すようにサーバーを構成しました(データは基本的にすべてのデータがクライアントに到達しない限り、役に立ちません)。だからこれをする代わりに...

MyCtrl.resolve = {
    projects : function($q, $http) {
        return $http.get('/api/projects'});
    },
    clients : function($q, $http) {
        return $http.get('/api/clients'});
    }
};

のようなURLに対して単一の GETリクエストを実行できるようにしたいのですが、そのための約束はに等しく設定され、その約束はに等しく設定されます。私の単一のリクエストで)。私はまだ約束に非常に慣れていません、誰かが私がこれらの約束を内部でどのように設定するかの例を私に与えることができますか?$http/api/allDataprojectsallData.projectsclientsallData.clientsallDataMyCtrl.resolve

4

2 に答える 2

6

私はそれがあなたが探しているものだと信じています:

var myApp = angular.module('myApp', []);

myApp.factory('myService', function ($http, $q) {
    return {
        getAllData: function () {
            return $q.all([ 
                // $q will keep the list of promises in a array
                $http.get('/api/projects'),
                $http.get('/api/clients')
            ]).then(function (results) {
            // once all the promises are completed .then() will be executed 
            // and results will have the object that contains the data 
                var aggregatedData = [];
                angular.forEach(results, function (result) {
                    aggregatedData = aggregatedData.concat(result.data);
                });
                 return aggregatedData;
            });
        }
     };
 });

最終的な配列からデータを取得できますaggregatedData(例:aggregatedData [0]、aggregatedData [1]、...)

MyCtrl.resolve内でこれらのpromiseを1回の呼び出しで設定できます。

resolve = {
    getAllData : myService.getAllData()
}
于 2013-10-05T17:10:16.177 に答える
4

ええと、あなたが知っている2つの約束を使用しても、同じ約束を表すことにはあまり意味がありません。しかし、実際には、1つのpromiseを処理し、2つのpromiseを返すサービスを作成できます。このようなもの:

var mod = angular.module('mod', []);
mod.service('theService', function($q, $http) {
  return function() {
    var cliDeferred = $q.defer(),
        proDeferred = $q.defer();

    $http.doYourStuff().then(function _onSuccess(data) {
      cliDeferred.resolve(data.clients);
      proDeferred.resolve(data.projects);
    }, function _onError(err) {
      cliDeferred.reject(err);
      proDeferred.reject(err);
    });

    return {clients: cliDeffered.promise, projects: proDeferred.promise};
  };
});

しかし、私が言ったように、これにはあまり意味がありません。おそらく、サービスが配列を返すことを考えると、より良い解決策は、空の配列を持つオブジェクトを返し、$httpの約束が完了したときにそれらを埋めることです。

于 2013-01-11T10:40:10.843 に答える