将多个承诺传递给$ q.all无效。

时间:2015-05-01 15:56:07

标签: javascript angularjs asynchronous

我试图遍历一个对象,然后从两个服务API函数中提取每次迭代的数据,然后返回数据并使用返回的结果填充当前的迭代对象。现在,由于这些服务函数正在使用$ http对象,因此返回promises,因此我需要等待响应才能填充我的对象。

这是我第一次使用$ q AngularJS库,我不确定我是否能够以我使用它的方式使用它。它我们没有正确返回所以我认为我不是,我似乎无法让我的代码工作。

这是我的代码:

控制器功能

$scope.returnTasksAndPayments = function() {
var defer = $q.defer();
var promisesTasks = [];
    var promisesPayments = [];
    for(var i in $scope.projects) {
        promisesTasks[i] = ProjectService.fetchTaskData($scope.projects[i].project_id);
                    promisesPayments[i] = ProjectService.fetchPaymentsData($scope.projects[i].project_id);
                }

                $q.all(promisesTasks, promisesPayments).then(function(promiseArray) {
                        console.log(promiseArray);
                });
            };

和我的服务功能:

this.fetchProjectsData = function(options) {
                return api().get("http://dashboards.blurgroup.dev/src/projectPayments/services/JSONdata.json", {
                    order     : options.order,
                    page      : options.page,
                    page_size : options.page_size,
                    status    : options.status,
                    search    : options.search,
                    assigned  : options.assigned
                });
            };

            this.fetchTaskData = function(options) {
                return api().get("http://dashboards.blurgroup.dev/src/projectPayments/services/JSONdataTasks.json", {

                });
            };

            this.fetchPaymentsData = function(options) {
                return api().get("http://dashboards.blurgroup.dev/src/projectPayments/services/JSONdataPayments.json", {

                });
            };

正如您所看到的,我正在尝试遍历我的$ scope.projects对象,为每次迭代调用两个函数并将它们放入单独的promise对象中,然后使用$ q.all来检查这两个promise对象是否已满足。

这似乎并没有正常工作,似乎数据存储在' promisesPayments' $ q.all函数中的数组未添加到$ q.all回调数组中的promiseArray变量中。

有人能指出我哪里出错了吗? 感谢

1 个答案:

答案 0 :(得分:5)

试试这个:

      SELECT movie.MVYEAR as "Movie Year", 
             movie.MVTITLE as "Movie Title", 
             star.STARNAME as "Star Name", 
             movstar.BESTM as "Best Male", movstar.BESTF as "Best Female"
        FROM movie
  INNER JOIN movstar 
          ON movie.MVNUM = movstar.MVNUM
  INNER JOIN star
          ON star.STARNUM = movstar.STARNUM
       WHERE movstar.BESTM IS NOT NULL 
          OR movstar.BESTF IS NOT NULL
    ORDER BY movie.MVYEAR ASC;