2016-07-15 4 views
1

Dies ist eine Methode in einer Fabrik:DataSnapshot.val() nicht zurück verarbeitete Wert sofort

kbUser.getCurrentUserDetails = function(){ 
    return $rootScope.ref.child("user/" + firebase.auth().currentUser.uid).once('value', function(snap){ 
     return snap.val(); 
    }); 
} 

ich diese Methode in einem Controller wie folgt aufrufen:

return kbUser.getCurrentUserDetails().then(function(details){ 

    // Here I need to do .val() once again 
    for (var attrname in details.val()) { kbUser.userObject.details[attrname] = details.val()[attrname]; } 
    kbUser.copyFirebaseDataToUser(firebaseUser).then(function(){ 
     return true; 
    }); 
}); 

Dies ist, was Ich bekomme zurück: details = W {A: P, W: U, g: ve}, die nicht mit meiner Datenbank übereinstimmt.

Wenn ich die details Variable hier lesen, habe ich details.val()wieder zu bekommen das erwartete JSON-Objekt aus meiner Datenbank zu tun. Ich verstehe nicht, warum das Ergebnis von snap.val() nicht in der Methode zurückgegeben wird, sondern nur die 'rohe' Firebase-Daten-Snapshot snap. Weiß jemand, warum das passiert?

Angenommen, das Werk ist korrekt eingerichtet.

Antwort

1

Grundsätzlich müssen Sie Kettenversprechen verwenden, so dass, wenn snap.val() zurückkommt, Sie die Daten darin erhalten können.

kbUser.getCurrentUserDetails().then(function(data){ 
    var user = data; 
}); 
+0

Ich mache das eigentlich schon. Ich fügte in meinem ersten Beitrag die tatsächliche Art und Weise hinzu, wie ich die Funktion anrufe. –