【问题标题】:Can't return value from async function. Why? [duplicate]无法从异步函数返回值。为什么? [复制]
【发布时间】:2018-05-28 20:25:53
【问题描述】:

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

【问题讨论】:

  • Can't return value from async function. Why? 因为它是异步的...... currentUserName().then(....) 是你应该调用的方式
  • promises.push(promise); return Promise.all(promises).then(function(val) { return val; }); - 啊,某人试图做不可能的事情的绝望阴谋......如果我有足够的异步层,它可能会无缘无故地变得同步!

标签: javascript firebase firebase-realtime-database


【解决方案1】:

你不应该使用 Promise.all,因为只有一个 Promise 被调用,即firebaseData.orderByKey().once('value')

once() 方法返回一个承诺(参见doc),该承诺将在对实时数据库的异步查询完成时得到解决。

所以你的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);
});

【讨论】:

  • "你应该把你的函数写成如下:"是的,但是为什么呢?
  • 此代码仍返回 ZoneAwarePromise
  • @Luca 我已经用更多上下文更新了答案。谢谢你的评论。
猜你喜欢
  • 2016-01-14
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多