Firebase Firestore:离线写入操作的承诺什么时候解决?

时间:2018-04-13 13:22:49

标签: javascript firebase google-cloud-firestore offline

我按照以下文档中的说明离线激活:

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)

我错过了什么吗?我希望承诺失败或解决,所以我可以做出相应的反应。

2 个答案:

答案 0 :(得分:2)

Firestore中写入操作的承诺只有在服务器确认写入完成时才会解决,即使它们可能已成功写入本地缓存。

答案 1 :(得分:0)

这是我的解决方法:

  1. 我将调用包装在一个函数中,无论离线/在线状态如何,该函数最终都应返回一个解决承诺
  2. 然后我从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规则返回的权限错误(在线时)。显然,即使应用重新联机,脱机模式下服务器发出的任何错误也将无提示地失败。

我很想在这里看到其他人的解决方案!