2016-07-28 11 views
2

Ich habe Probleme bei der Lösung eines Versprechens, das von Firebase zurückgegeben wird. Dies ist ein ionic - angularjs - firebase Projekt, das ich bauen werde. Das Problem ist, dass meine Funktion ein Versprechen zurückgibt, das ein Array von 3 Benutzern enthält, aber ich kann dieses Versprechen nicht auspacken.Auflösen eines Versprechen-Arrays

Promise returned from firebase query

Mein Code:

function eventusers(id) { 
    var userarr = []; 
    var deferred = $q.defer(); 

    // *The code below makes 2 firebase calls and returns an array of users* 

    eventref.orderByChild("Eventid").equalTo(eventid).on("value", function(snap) { 
     var users = snap.val(); 
     angular.forEach(users, function(value,key) { 
      var obj = value; 
      for (var prop in obj) { 
       if(obj[prop] == "True") { 
        userref.child(prop).on("value", function (snap) { 
         var id = snap.val().email; 
         userarr.push(id); 
         console.log(userarr); // I am able to see the list of users here 
        }); 
       }; 
      } 
     }); 
     deferred.resolve(userarr); 
    }); 
    return deferred.promise; 
}; 

//The console.log shows a promise (pls see the attached pic) 
console.log(eventusers(eventid)); 

// I tried to loop through the response using angular.forEach and also a for loop but it does 
//not execute that part of the code as I do not see the response of the console.log. If I 
//replace the for loop with just console.log(response), then I get an empty array. 

eventusers(eventid).then(function (response) { 
    for (var i = 0; i <response.length; i++) { 
     console.log(response[i]); 
    } 
}); 

Antwort

2

Ihre latente Versprechen wird die Lösung vor dem inneren asynchronen Aktion

userref.child(prop).on('value', ... 

abgeschlossen ist.

Sie müssen das in ein anderes verzögertes Objekt einbinden und dann ein Versprechen zurückgeben, das alle inneren Versprechen löst.

function eventusers(id) { 
    return $q(function(resolve) { 
     eventRef.orderByChild('Eventid').equalTo(id).on('value', function(snap) { 
      var promises = []; 
      snap.val().forEach(function(user) { 
       angular.forEach(user, function(userProp, prop) { 
        if (userProp === 'True') { 
         promises.push($q(function(resolve) { 
          userref.child(prop).on('value', function(snap) { 
           resolve(snap.val().email); 
          }); 
         })); 
        } 
       }); 
      }); 

      resolve($q.all(promises)); 
     }); 
    }); 
} 

eventusers(eventid).then(function (response) { 
    for (var i = 0; i < response.length; i++) { 
     console.log(response[i]); 
    } 
}); 
+0

Danke Phil !. Das hat funktioniert. – AjRev

0

Code ändern zu

eventusers(eventid).then(function (response) { 
var myArray = response.value; 
for (var i = 0; i <myArray.length; i++) { 
console.log(myArray[i]); 
}; 

Da Ihr Objekt Array innerhalb verheißungs Objekt ist


You can also refer to Plunker

+0

OP schiebt nur E-Mails in 'userarr' die der Entschlossenheit Wert ist, damit ich bin nicht sicher, warum Sie denken, würden sie eine' value' Eigenschaft – Phil

+1

Hallo Romesh, Vielen Dank für Ihre Zeit. Ich habe deinen Plünderer überprüft. myData enthält die Eigenschaft 'value' (ein Array von Werten - ID: 1 usw.), mit der Sie in der Funktion getPromiseObject darauf zugreifen können. Mein Versprechungsobjekt gibt ein Array zurück, das drei E-Mails im Muster enthält: [0: email1, 1: email2, 2: email3]. – AjRev

Verwandte Themen