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:
我对此进行了更多研究,显然在<root>
区域而不是angular
区域中运行重定向firebase 身份验证回调之后。这就解释了为什么没有触发变更检测。
编辑#2:
angularfire2 repo 中的以下提交表示,firebase 可以在 angular Zone 存在之前添加 websocket 侦听器。所以我认为这就是我看到身份验证回调在<root>
区域而不是angular
区域运行的原因。
由于 Firebase 在 Angular Zone 存在之前添加 WebSocket 侦听器, 接收到数据时的所有回调都在 Angular 之外执行 区域并且不会触发更改检测
https://github.com/angular/angularfire2/pull/648/commits/8b2c7a400418a68b6f25654067ce6cf918ceb681
【讨论】:
以上是关于Firebase Datasnapshot Observable 在通过重定向登录后不会立即更新的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 实时数据库 datasnapshot.has Child
如何使用 DataSnapshot 和 Firebase for Unity?
如何从 Android 上的 Firebase DataSnapshot 中提取对象列表