Javascript Firebase:等待异步并推送到阵列

Javascript Firebase:等待异步并推送到阵列,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我希望获得指定的所有数据,并将其推送到数组,但此函数在进程完成之前返回回调 函数getRadiusPartner(){ getAllPartner() .then(功能(捕捉){ var位置=[]; snap.forEach(函数(用户){ coordsRef.child(user).once(“值”,函数(快照){ location.push(snapshot.val()); }) }) 返回承诺。全部(位置) }); } 如果要等待承诺,通常不能使用.forEach()。 Javascr

我希望获得指定的所有数据,并将其推送到数组,但此函数在进程完成之前返回回调

函数getRadiusPartner(){ getAllPartner() .then(功能(捕捉){ var位置=[]; snap.forEach(函数(用户){ coordsRef.child(user).once(“值”,函数(快照){ location.push(snapshot.val()); }) }) 返回承诺。全部(位置) }); }
如果要等待承诺,通常不能使用.forEach()。 Javascript和承诺不能以那种方式知道何时完成forEach

现在您有几个选择:

  • 您可以使用一个简单的setTimeout函数,等待一秒钟或稍短一点,然后实现承诺

    function getRadiusPartner(){
     getAllPartner()
      .then(function (snap){
        var location = [];
        snap.forEach(function(user){
        coordsRef.child(user).once("value", function(snapshot){         
          location.push(snapshot.val());
        })  
       })
      setTimeout(function(){return Promise.all(location)},1500);
     });
    } 
    
  • 如果您有一个数组,那么可以使用If语句检查循环是否为array.length-1,然后解析承诺

  • 如果知道要查找的内容,可以在foreach循环中找到该项后返回

     findItem = function (id) {
     var defer = $q.defer();
     snap.forEach(items, function (item) {
     if (item.id === id) {
        defer.resolve(item);
      }
     });
    return defer.promise;
    };
    

  • 谢谢你。。如果我想使用第一个选项,那么如果数据超过1500,怎么样?好吧,第一个选项是手动方法,不是最有效的,但它是最容易实现的。forEach循环非常快。如果出于某种原因,比如说上网速度慢,或者是从网上撤下来,或者诸如此类的原因,你可以把时间延长一点,以防万一