我在我的Angular(11.1.1)项目中使用AngularFire
(6.1.4)与离线持久性,我很惊讶地看到,在加载时,数据提供了两次:一次来自缓存,一次来自服务器(我使用变量fromCache
来证明源)。
app.module.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 { ...}
<<p>DB服务/strong>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的工作方式:当你为快照附加一个监听器时,它会立即触发数据的本地状态(如果有的话)。然后,它对服务器进行检查,这可能需要一些时间,并再次触发来自服务器的状态,如果它与本地缓存不同(或者您请求的元数据也发生了变化)。