我想从currentUserName()函数返回名称,但我得到了ZoneAwarePromise。这是我的代码:
currentUserName() {
var firebaseData = firebase.database().ref('users');
var userid = this.afAuth.auth.currentUser.uid;
var promises = [];
var name;
var promise = firebaseData.orderByKey().once('value').then(function
(snapshot) {
snapshot.forEach(function (childSnapshot) {
if (childSnapshot.key === userid) {
name = childSnapshot.val().displayName;
}
});
return name;
});
promises.push(promise);
return Promise.all(promises).then(function(val) { return val; });
}
答案 0 :(得分:-3)
你不应该使用Promise.all,因为只有一个承诺被调用,即firebaseData.orderByKey().once('value')
。
once()方法返回一个promise(请参阅doc),当完成对Real Time Database的异步查询时,它将被解析。
因此,您的currentUserName()
函数将返回带有查询结果的promise,并且在调用此函数时应使用then()
。
所以,你应该按如下方式编写你的函数:
function currentUserName() {
var firebaseData = firebase.database().ref('users');
var userid = this.afAuth.auth.currentUser.uid;
return firebaseData.orderByKey().once('value').then(function(snapshot) {
var name;
snapshot.forEach(function (childSnapshot) {
if (childSnapshot.key === userid) {
name = childSnapshot.val().displayName;
}
});
return name;
});
}
并按如下方式调用:
currentUserName().then(function(snapshot) {
console.log(snapshot);
});