2016-12-05 79 views
1

我试图排名基础上,他们有多少次出现在多个列表的用户列表:是forEach()异步吗?

function getRegistrationsFromSportList(sportList){ 
     console.info('[DatabaseService-getRegistrationsFromSportList] Getting registrations to sports...'); 
     var promiseHash = {}; 
     sportList.forEach(function (sport){ 
      promiseHash[sport] = firebase.database().ref('/sport_registrations/' + sport).once('value'); 
     }); 
     return $q.all(promiseHash); 
     } 

     getUserSportListPromise(user.uid).then(function(sportList){ 
     return getRegistrationsFromSportList(sportList); 
     }) 
     .then(function(registrationsHash){ 
     console.info('[DatabaseService-getMatches] Processing matches...'); 
     var matches = []; 
     angular.forEach(registrationsHash, function(regsSnap, sport){ 
      console.dir(regsSnap.val()); 
      regsSnap.forEach(function(user){ 
       if (matches.indexOf(user.key) > -1) { 
       matches[user.key]++; 
       } else{ 
       matches[user.key] = 1; 
       } 
       console.dir(matches); 
      }); 
     }); 
     }); 
    } 

这里是我的控制台日志:

Object 
e8wXuTklnVcYknc0MYn34xlcqmA3: true 

Array[0] 
Lvwr4lkZ58SnhrZzft6FhT08iVN2: 1 
ND9iZYJ3gfQUvjKSRaKKc8NEkAj2: 1 
SA0h1iHwyCSeytgh6FOglSf1sOs2: 1 
e8wXuTklnVcYknc0MYn34xlcqmA3: 1 

Object 
Lvwr4lkZ58SnhrZzft6FhT08iVN2: true 
ND9iZYJ3gfQUvjKSRaKKc8NEkAj2: true 
SA0h1iHwyCSeytgh6FOglSf1sOs2: true 
e8wXuTklnVcYknc0MYn34xlcqmA3: true 

Array[0] 
Lvwr4lkZ58SnhrZzft6FhT08iVN2: 1 
ND9iZYJ3gfQUvjKSRaKKc8NEkAj2: 1 
SA0h1iHwyCSeytgh6FOglSf1sOs2: 1 
e8wXuTklnVcYknc0MYn34xlcqmA3: 1 
  1. 为什么是我的第一个控制台。 info()显示匹配数组填充regsSnap的第二个对象的结果?我不明白为什么当我在foreach()函数中调用console.info()这是发生
  2. 我猜密切相关的1点,但我期待e8wXuTklnVcYknc0MYn34xlcqmA3等于2
  3. 为什么控制台显示Array [0]而不是Array [3]?

有什么建议吗?帮帮我?

谢谢!

+2

不,'forEach()'不是异步的 – devqon

+0

您了解我的代码的行为吗? –

回答

3

不,forEach()不是异步的,既可以是有角的也可以是原生的。

对于第一个问题,我不认为有足够的代码来了解您的代码为什么这样表现,其他人返回的是什么?你能粘贴完整的控制台输出吗?

关于第二个问题,这个比较永远是假的,matches.indexOf(user.key) > -1,是更好,如果你使用if (matches[user.key])甚至三级的表达,如:

matches[user.key] = matches[user.key] ? matches[user.key] + 1 : 0; 

对于第三个问题,因为你没有任何推动因素对于数组,您要向键添加值,但从技术上讲,只有使用数字键或使用push方法时,该数组才具有零个元素。要么将匹配项更改为对象,要么更改存储方式并从中检索信息。