3

我想在我的 AngularJS 应用程序中实现承诺,就像你在这个例子中看到的那样: https ://stackoverflow.com/a/12360882/371273

我的应用程序将获取多个数据数组,在我的服务器上产生多个数据库命中,但我已将服务器配置为返回所有这些数据作为一个响应,以尽量减少请求以保持我的应用程序尽可能高效(数据本质上是除非所有数据都到达客户端,否则无用)。因此,与其这样做...

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

我希望能够向像这样的 URL 发出一个GET $http请求/api/allData,然后有一个承诺projects将设置为等于,allData.projects并且承诺clients将设置为等于allData.clients,等等(allData返回的数据在哪里我的一个请求)。我对 Promise 还是很陌生,有人可以给我一个例子来说明我如何在里面设置这些 PromiseMyCtrl.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 中设置这些承诺:

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

好吧,使用两个你知道代表同一个承诺的承诺没有多大意义。但是您确实可以创建一个接收处理一个承诺并返回两个的服务。像这样的东西:

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 回答