2017-02-14 5 views
0

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を使用していたので、私の配列はすべての情報で満たされているはずなので、その結果は分かりません。

提案がありますか? GroupService.getUserJoinedGroupsArrayは、非同期呼び出しであるためである

おかげ

答えて

0

。完了するまで待ってからリストをtmpGroupsにプッシュして約束を実行する必要があります。中に約束してみてください

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); 
    }); 
+0

私は確かに働いていました。ありがとう! –

+0

ねえ、私は似たような問題を抱えています....ほとんど同じ、非同期の問題に見えますが、私の並べ替えがコントローラに返される前に私の結果を事前に配置する必要があるのか​​分からない。あなたは見てみることができますか? https://stackoverflow.com/questions/46494215/sorting-q-all-responses-not-working – rolinger

関連する問題