我按照以下文档中的说明离线激活:
firebase
.firestore()
.enablePersistence()
.then(() => {
console.log('offlinemode acctivated')
})
日志按照我的预期显示。
添加如下数据时:
db
.collection('foo')
.add({foo: 'bar'})
.then(docRef => {
console.log('Added Foo: ', docRef.id)
// do some stuff here with the newly created foo and it's id.
})
.catch(console.error)
离线时调用.then()
和.catch()
都不会。即使在执行此回调时,该对象也会添加到我的脱机数据库中的foo集合中:
db
.collection('foo')
.onSnapshot(callback)
我错过了什么吗?我希望承诺失败或解决,所以我可以做出相应的反应。
答案 0 :(得分:2)
Firestore中写入操作的承诺只有在服务器确认写入完成时才会解决,即使它们可能已成功写入本地缓存。
答案 1 :(得分:0)
这是我的解决方法:
onSnapshot
获取保存的文档,该文档返回写入本地缓存的文档(在线和离线均可)。这是我的代码(带一点打字稿):
export function dbWritePromise(functionPromise: Promise<any>): Promise<any>{
if(window.navigator.onLine){
return functionPromise
}
else{
return Promise.resolve()
}
}
// I grabbed this function from a Github issue one upon a time
export function docSnapshotPromise(ref: firebase.firestore.DocumentReference): Promise<any>{
return new Promise((resolve, reject) => {
const unsubscribe = ref.onSnapshot(doc => {
resolve(doc)
unsubscribe()
}, err => {
reject(err)
unsubscribe()
})
})
}
正在使用(我在这里使用update
函数,但是add
的工作方式相同)此代码正在处理来自organizations
集合中的文档:
try{
//update org doc
await dbWritePromise(orgRef.update({
name: 'New and improved name here'
}))
// wait for this updated doc to be written to local cache, then we can get the updated org
const updatedOrgRef = await docSnapshotPromise(orgRef)
const updatedOrg = updatedOrgRef.data()
console.log(updatedOrg.name) // outputs the new and improved name
}
catch (err) { handleError(err) }
引发的错误可能是本地缓存出现的某些错误,也可能是服务器错误,例如由Firestore规则返回的权限错误(在线时)。显然,即使应用重新联机,脱机模式下服务器发出的任何错误也将无提示地失败。
我很想在这里看到其他人的解决方案!