2016-12-29 1 views
1

Ich möchte alle angegebenen Daten abrufen und an Array, aber diese Funktion Callback zurückgeben, bevor der Prozess abgeschlossen ist.Firebase: Warten auf Async und Push an ein Array

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

Antwort

0

Normalerweise können Sie .forEach() nicht verwenden, wenn Sie auf ein Versprechen warten möchten. Javascript und Versprechungen funktionieren nicht auf diese Weise zu wissen, wann forEach ausgeführt wird.

Jetzt haben Sie ein paar Optionen:

  1. Sie können eine einfache SetTimeout Funktion haben, die eine zweite oder etwas weniger wartet und erfüllt dann das Versprechen.

    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. Wenn Sie ein Array haben könnten Sie haben eine if-Anweisung, wenn die Schleife überprüft bei Array.length - 1 ist und dann das Versprechen lösen

  3. Wenn Sie wissen, was Sie, die Sie suchen kann zurückkommen, nachdem Sie das Einzelteil in der foreach-Schleife

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

thankyou finden .. wenn ich erste Option verwenden möchten, wie wäre es, wenn die Daten als 1500 mehr bekommen? –

+0

Nun, die erste Option ist ein manueller Ansatz und nicht der effizienteste, aber es ist am einfachsten zu implementieren. Eine ForEach-Schleife ist sehr, sehr schnell. Wenn aus irgendeinem Grund wie Internet langsam ist, wenn Sie online oder etwas ähnliches ziehen, können Sie die Zeit für den Fall ein wenig länger machen –