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

时间:2016-12-29 11:51:46

标签: javascript node.js firebase firebase-realtime-database

我想获取指定的所有数据,并推送到数组,但此函数在进程完成之前返回回调。

function getRadiusPartner(){
      getAllPartner()
      .then(function (snap){
        var location = [];
        snap.forEach(function(user){
            coordsRef.child(user).once("value", function(snapshot){         
                location.push(snapshot.val());
            })  
        })
        return Promise.all(location)
    });
}

1 个答案:

答案 0 :(得分:0)

通常,如果您想等待承诺,则不能使用.forEach()。 Javascript和承诺不会以知道何时完成forEach的方式工作。

现在你有几个选择:

  1. 你可以有一个简单的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);
     });
    } 
    
  2. 如果你有一个数组,你可以有一个if语句来检查循环是否在Array.length - 1然后解析promise

  3. 如果您知道自己在找什么,可以在foreach循环中找到该项后返回

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