Javascript 启用enablePersistance时,AngularFire从缓存和服务器返回结果
在我的AngularFire(11.1.1)项目中,我使用了Javascript 启用enablePersistance时,AngularFire从缓存和服务器返回结果,javascript,angular,firebase,angularfire2,angularfire2-offline,Javascript,Angular,Firebase,Angularfire2,Angularfire2 Offline,在我的AngularFire(11.1.1)项目中,我使用了AngularFire(6.1.4)进行离线持久化,我惊讶地发现在加载时,数据被提供了两次:一次来自缓存,一次来自服务器(我使用变量fromCache,以验证源代码) 应用程序模块.ts import { AngularFirestoreModule } from '@angular/fire/firestore'; import { AngularFireModule } from '@angular/fire'; import {
AngularFire
(6.1.4)进行离线持久化,我惊讶地发现在加载时,数据被提供了两次:一次来自缓存,一次来自服务器(我使用变量fromCache
,以验证源代码)
应用程序模块.ts
import { AngularFirestoreModule } from '@angular/fire/firestore';
import { AngularFireModule } from '@angular/fire';
import { AngularFireAuthModule } from '@angular/fire/auth';
@NgModule({
imports: [
AngularFireModule.initializeApp(Config),
AngularFirestoreModule.enablePersistence(),
AngularFireAuthModule
]
})
export class AppModule { ...}
DB服务
this.firestoreRef.collection(collectionName, query)
.snapshotChanges()
.pipe(
map(actions => actions.map(a => {
console.log('fromCache -> ', a.payload.doc.metadata.fromCache);
}))
).subscribe(/* Just for TEST purposes */);
我在想,对于get()
选项,同样的逻辑也适用:
设置为默认值(或根本不设置)会导致Firestore尝试检索最新(服务器检索到的)快照,但如果无法访问服务器,则返回缓存数据
如果用户在线,为什么还会返回缓存数据?
当然,我可以监听离线/在线事件(尽管它们不可靠),甚至可以监听软件来检查客户端是否在线,并相应地使用或跳过缓存结果,但Firestore不应该检测在线/离线状态吗?来自以下文档:
可以使用onSnapshot()方法侦听文档。使用您提供的回调函数进行的初始调用会立即使用单个文档的当前内容创建文档快照
虽然这涉及单个文档,但在侦听多个文档时也同样适用
因此,您看到的是Firestore的工作原理:当您为快照连接侦听器时,它会立即使用数据的本地状态(如果有的话)触发。然后,它会检查服务器,这可能需要一些时间,如果服务器的状态与本地缓存不同(或者您也请求调用元数据更改),它会再次使用服务器的状态进行激发。投反对票的用户至少可以解释为什么会这样做。至少,我和其他人可以改进问题或进一步完善问题。我在文件里找不到我问题的答案。仅仅根据“感觉”投票是一种悲哀的习惯。感谢弗兰克给了我一个很好的答案(我读了那页文档,盲目地错过了前三行)。然后需要一些自定义逻辑来过滤此“双重”数据集(我通常使用
valueChanges
而不是onSnapshot
),因为2。时间与来自服务器的数据一起触发,即使它是第一个页面加载,因此数据应该与缓存/本地中的数据相同。在这种情况下,是否有一种最佳实践可以避免在HTML模板中加载两次数据?最佳实践是在数据进入时显示数据。因此,当您第一次显示本地数据时,然后当服务器上的数据可用时,您可以使用该数据更新UI。再次感谢。我将不得不看看这如何与ngrx操作相适应,因为它们将被触发两次(例如LoadDataSucces),但它仍然有意义,因为它反映了来自服务器的更改。