2016-12-29 4 views
1

すべてのデータを取得して配列にプッシュしたいが、この関数はプロセスが終了する前にコールバックを返す。Firebase:Asyncの待機と配列へのプッシュ

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

答えて

0

通常、約束を待つ場合は.forEach()を使用できません。 forEachがいつ実行されるかを知るために、Javascriptと約束は動作しません。

  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. あなたは配列を持っている場合は、ループがArray.lengthとであるかどうかを確認するif文を持つことができます - 1、その後、あなたがあなたの探しているものを知っていれば約束

  3. を解決あなたはforeachループ

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

ありがとう..私は最初のオプションを使用する場合、どのようにデータが1500以上のものを得ることについての場合でアイテムを見つける後に返すことができますか? –

+0

最初の選択肢は手作業であり、最も効率的ではありませんが、実装が最も簡単です。 forEachループは非常に高速です。何らかの理由でインターネットが遅くなっているような場合は、オンラインなどの方法で引き出すと時間がちょっと長くなることがあります –

関連する問題