是forEach()异步的吗?

Man*_*UEZ 2 javascript angularjs

我试图根据用户在几个列表中出现的次数来对用户列表进行排名:

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);
          });
        });
      });
    }
Run Code Online (Sandbox Code Playgroud)

这是我的控制台日志:

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
Run Code Online (Sandbox Code Playgroud)
  1. 为什么我的第一个console.info()显示matchs数组填充了regsSnap的第二个Object的结果?我不明白为什么在forEach()函数中调用console.info()时会发生这种情况
  2. 我猜想与第1点密切相关,但我期望e8wXuTklnVcYknc0MYn34xlcqmA3等于2
  3. 为什么控制台显示Array [0]而不是Array [3]?

有什么建议吗?救命?

谢谢!

Dvi*_*lva 5

不,forEach()不是异步的,无论是角度的还是本机的。

对于第一个问题,我认为没有足够的代码来了解您的代码为何如此运行,其他代码返回什么?您可以粘贴完整的控制台输出吗?

对于第二个问题,此比较始终为false,matches.indexOf(user.key) > -1如果您使用if (matches[user.key] )甚至是以下三次表达式,则效果更好:

matches[user.key] = matches[user.key] ? matches[user.key] + 1 : 0;
Run Code Online (Sandbox Code Playgroud)

对于第三个问题,由于尚未将任何元素推入数组,因此要向键添加值,但是从技术上讲,该数组具有零个元素,直到您使用数字键或使用push方法为止。更改要么匹配成为对象,要么更改您存储和检索对象信息的方式。