Firebase Datasnapshot Observable 在通过重定向登录后不会立即更新

Posted

技术标签:

【中文标题】Firebase Datasnapshot Observable 在通过重定向登录后不会立即更新【英文标题】:Firebase Datasnapshot Observable not updating immediately after login via redirect 【发布时间】:2017-08-23 03:56:32 【问题描述】:

朋友。

所以,我不理解这个 RxJS 的东西,因为它与 Angular 相关。我有一个 Promise 工作(用户身份验证事件), 但我从 Firebase 异步获取数据的尝试并不顺利。

此代码在大多数情况下都有效,但在一种情况下除外:当用户登录时(通过重定向)。在这种情况下,我们看到 用户身份验证事件发生,然后(可能)运行更改检测周期,导致 UI 更新为 显示当前登录的用户,然后(大概)一个数据库事件来自 Firebase(我们看到登录 控制台),但没有另一个更改检测周期(我认为应该有),因此 UI 不会随 来自 d/b 的新信息。如果我等待 10-15 秒(大约;我实际上没有计时),或者如果我在 UI 中输入一些内容 文本字段,然后 UI 会使用数据快照进行更新。

我通过 Observable.fromEventPattern() 将 Observable 连接到 Firebase 事件。

如果您已经登录并打开,这件事就像一个冠军 或刷新页面。如果您尝试登录,它就是行不通的。我没有完全登录可能无济于事 了解重定向中发生了什么。

那么……我做错了什么? (实际上,我确信我做错了很多事情。)

我在https://github.com/JohnL4/FirebaseRxPlay/releases/tag/problem-reproduction 有一个玩具应用程序,它重现了我的问题。

【问题讨论】:

为什么“接近”投票? 【参考方案1】:

我在我的项目中遇到了同样的问题。我觉得它与 zone.js 以及角度如何检测是否有更改有关,因为您必须触发一些导致视图更新的操作才能看到您的更改。 我决定像这样在 NgZone 中运行所有 firebase 的回调

tagsRef.on('value', snapshot => 
    this.zone.run(() => 
        const tags = Object.keys(snapshot.val() || );
        observer.next(tags);
    );
);    

我也为 auth 回调做了同样的事情

getAuthRedirectResult$(): Observable<firebase.auth.UserCredential> 
    return new Observable<firebase.auth.UserCredential>(observer => 
      this.firebaseService.auth.getRedirectResult()
        .then((result: firebase.auth.UserCredential) => 
           if (result.user) 
             this.zone.run(() => 
               observer.next(result);
             );
           
        )
        .catch(error => 
          this.zone.run(() => 
          observer.error(error);
         );
    );
);

这解决了我的问题。

我唯一不确定的是为什么这个问题只发生在身份验证重定向之后。

编辑#1:

我对此进行了更多研究,显然在&lt;root&gt; 区域而不是angular 区域中运行重定向firebase 身份验证回调之后。这就解释了为什么没有触发变更检测。

编辑#2: angularfire2 repo 中的以下提交表示,firebase 可以在 angular Zone 存在之前添加 websocket 侦听器。所以我认为这就是我看到身份验证回调在&lt;root&gt; 区域而不是angular 区域运行的原因。

由于 Firebase 在 Angular Zone 存在之前添加 WebSocket 侦听器, 接收到数据时的所有回调都在 Angular 之外执行 区域并且不会触发更改检测

https://github.com/angular/angularfire2/pull/648/commits/8b2c7a400418a68b6f25654067ce6cf918ceb681

【讨论】:

以上是关于Firebase Datasnapshot Observable 在通过重定向登录后不会立即更新的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实时数据库 datasnapshot.has Child

Firebase dataSnapshot 如何访问值

如何使用 DataSnapshot 和 Firebase for Unity?

如何从 Android 上的 Firebase DataSnapshot 中提取对象列表

如何从 Android 上的 Firebase DataSnapshot 中提取对象列表

Flutter:未为 DataSnapshot 类定义 forEach 方法