【问题标题】:Sort an array of objects after $q.all resolves在 $q.all 解析后对对象数组进行排序
【发布时间】:2017-02-15 00:27:58
【问题描述】:

使用 AngularJs 编写应用程序。我想检索用户加入的所有组的列表。

我写了以下内容:

controller('DashCtrl', function($scope, $q, $localStorage, AuthService, DatabaseService, GroupService) {
  console.log("*** DashCtrl ***");
  var user = AuthService.currentUser;
  $scope.user = user;
  var uid = $scope.user.auth.uid;

  $scope.joinedGroups = [];

  var tmpGroups = [];
  var addGroupDetailsPromises = [];

  GroupService.getUserJoinedGroupsArray($scope.user.auth.uid)
  .then(function(groups) {
    for (var i = 0; i < groups.length; i++) {
      var tmpGroup = {};
      tmpGroup.id = groups[i];
      addGroupDetailsPromises.push(addGroupDetails(tmpGroup));
      tmpGroups.push(tmpGroup);
    }
  })
  .catch(function(error) {
    console.log('Error retrieving groups: ', error);
  });

  // Once all details have been added to groups, sort groups
  $q.all(addGroupDetailsPromises).then(function() {
    console.log(tmpGroups.length);
    tmpGroups.sort(function(a, b) {
      console.log('a: ', a.details.timestamp);
      console.log('b: ', b.details.timestamp);
      return a.details.timestamp - b.details.timestamp;
    });

    console.log(tmpGroups);
    $scope.joinedGroups = tmpGroups;
  }).catch(function(error) { console.log(error); });

  function addGroupDetails(tmpGroup) {
    var promise = new Promise(function(resolve, reject) {
      GroupService.getGroupDetailsObj(tmpGroup.id).then(function(details) {
        tmpGroup.details = details;
        tmpGroup.display = {};
        var eventDate = new Date(details.timestamp);
        var today = new Date();

        if (eventDate >= today) {
          tmpGroup.display.day = eventDate.getDate();
          tmpGroup.display.month = monthNames[eventDate.getMonth()].substr(0, 3);
          tmpGroup.display.time = eventDate.getHours() + ":" + eventDate.getMinutes();

        }

        resolve();
      });
    });

    return promise;
  };

  var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

})

我的组数组 (tmpGroups) 永远不会被排序。根据我的 console.log(tmpGroups.length) 的输出,数组的长度等于 0...我猜这就是它永远不会被排序的原因。

但我不明白这个结果,因为我的数组应该填充所有信息,因为我使用 $q.all 等待所有承诺得到解决。

有什么建议吗?

谢谢

【问题讨论】:

    标签: javascript angularjs sorting angular-promise


    【解决方案1】:

    那是因为 GroupService.getUserJoinedGroupsArray 是异步调用。您必须等到它完成然后将列表推送到 tmpGroups 然后执行承诺。试着把 promise 放进去

    GroupService.getUserJoinedGroupsArray($scope.user.auth.uid)
      .then(function(groups) {
        for (var i = 0; i < groups.length; i++) {
          var tmpGroup = {};
          tmpGroup.id = groups[i];
          addGroupDetailsPromises.push(addGroupDetails(tmpGroup));
          tmpGroups.push(tmpGroup);
        }
    
        // Once all details have been added to groups, sort groups
        $q.all(addGroupDetailsPromises).then(function() {
           console.log(tmpGroups.length);
           tmpGroups.sort(function(a, b) {
             console.log('a: ', a.details.timestamp);
             console.log('b: ', b.details.timestamp);
             return a.details.timestamp - b.details.timestamp;
        });
    
          console.log(tmpGroups);
         $scope.joinedGroups = tmpGroups;
        }).catch(function(error) { console.log(error); });
        })
      .catch(function(error) {
        console.log('Error retrieving groups: ', error);
      });
    

    【讨论】:

    • 嘿伙计们,我有一个类似的问题....看起来几乎一样,一个异步问题,但无法弄清楚我的排序需要去哪里对我的结果进行预排序,然后再返回到控制器。你能看看吗? stackoverflow.com/questions/46494215/…
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多