【问题标题】:Async function returns ZoneAwarePromise in Angular异步函数在 Angular 中返回 ZoneAwarePromise
【发布时间】:2018-11-07 10:36:44
【问题描述】:

我有函数 currentUserName() 应该返回 name 但返回包含正确数据的 __zone_symbol__value 的 ZoneAwarePromise。

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

函数调用:

this.currentUserName().then(function (snapshot) { return snapshot; }));

【问题讨论】:

    标签: javascript angular firebase


    【解决方案1】:

    为什么不使用承诺?

    currentUserName(): Promise<any> {
            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;
    
    }
    

    这样称呼它

    this.currentUserName().then(function(name) { console.log(name) }));
    

    【讨论】:

    • 如果 firebase 在您的 forEach 中返回数据,请尝试记录它的结果
    • 是的,如果我在解析之前记录它,它会返回正确的数据。但在控制台中,它显示在 zoneawarepromise 之后。
    • 但据我所知,您的目标是获取当前活动用户的名称?如果是这样,为什么不订阅this.afAuth.authState.subscribe(user =&gt; console.log(user))
    • 问题是 authstate 不知道名称。它知道电子邮件、密码和 uid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多