无法从异步函数返回值。为什么?

时间:2018-05-28 08:56:33

标签: javascript firebase firebase-realtime-database

我想从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; });
}

1 个答案:

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