javascript - forEach() 是异步的吗?

标签 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);
          });
        });
      });
    }

这是我的控制台日志:

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

有什么建议吗?帮忙?

谢谢!

最佳答案

不,forEach() 不是异步的,无论是 Angular 还是 native 的。

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

对于你的第二个问题,这种比较总是错误的, matches.indexOf(user.key) > -1,如果你使用 if (matches[user.key] ) 会更好 甚至是第三级表达式,例如:

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

对于第三个问题,因为您没有将任何元素推送到数组中,所以您正在向键添加值,但从技术上讲,数组的元素为零,直到您使用数字键或使用推送方法。要么将匹配项更改为对象,要么更改存储和检索信息的方式。

关于javascript - forEach() 是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976357/

相关文章:

javascript - ng-repeat 中的输入总和

javascript - Angular - 根据操作显示/隐藏表单

javascript - 创建动态号码回调函数

javascript - 如何迭代数组中的元素,但在满足条件之前不从索引移动?

javascript - jQuery 匿名函数的 ESLint 错误

javascript - angularjs - 了解 $ 标记和服务

javascript - 使用 JQuery、Ajax、PHP 和 MySQL 的多个文本框字段

android - 无法读取未定义的属性 'getPicture' - ionic 相机

javascript - Angular 中的多重嵌入问题

javascript - $routeParams 中的参数未定义,但 $routeParams 未定义