2016-07-15 64 views
1

这是一个工厂中的一个方法:DataSnapshot.val()不返回处理值立即

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

我称之为控制器这种方法是这样的:

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

这是什么我得到返回:details = W {A: P, W: U, g: ve},这不符合我的数据库。

当我在这里读取details变量时,我必须再执行details.val()再次以从我的数据库中获取预期的JSON对象。我不明白为什么snap.val()的结果没有在方法中返回,而只是'原始'firebase datasnapshot snap。有人知道这是为什么发生?

假设工厂安装正确。

回答

1

基本上你需要使用链承诺,以便当snap.val()得到回报时,你可以得到它的数据。

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

我实际上已经这么做了。我在我的第一篇文章中添加了我称之为函数的实际方式。 –