Javascript Firebase Firestore:脱机写入操作的承诺何时解决?

Javascript Firebase Firestore:脱机写入操作的承诺何时解决?,javascript,firebase,google-cloud-firestore,offline,Javascript,Firebase,Google Cloud Firestore,Offline,我按照文档中的说明离线激活了,如: firebase .firestore() .enablePersistence() .then(() => { console.log('offlinemode acctivated') }) 日志如我所料出现 添加这样的数据时: db .collection('foo') .add({foo: 'bar'}) .then(docRef => { console.l

我按照文档中的说明离线激活了,如:

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)

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

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

以下是我的解决方案:

  • 我将调用封装在一个函数中,该函数最终应该返回一个解析承诺,而不管脱机/联机状态如何
  • 然后,我从
    onSnapshot
    获取保存的文档,它返回写入本地缓存的文档(在线和离线都可用)
  • 这是我的代码(带有一点打字脚本):

    导出函数dbWritePromise(functionPromise:Promise):Promise{
    if(window.navigator.onLine){
    回报函数承诺
    }
    否则{
    返回承诺。解决()
    }
    }
    //我一次又一次地从Github上获取了这个函数
    导出函数docSnapshotPromise(参考:firebase.firestore.DocumentReference):Promise{
    返回新承诺((解决、拒绝)=>{
    const unsubscribe=ref.onSnapshot(doc=>{
    解决(文档)
    退订
    },err=>{
    拒绝(错误)
    退订
    })
    })
    }
    
    在使用中(我在这里使用
    更新
    功能,但是
    添加
    也会以同样的方式工作)此代码正在处理名为
    组织
    的集合中的文档:

    试试看{
    //更新组织文档
    等待dbWritePromise(orgRef.update({
    名称:“此处的新名称和改进名称”
    }))
    //等待此更新的文档写入本地缓存,然后我们可以获取更新的组织
    const updatedOrgRef=等待docSnapshotPromise(orgRef)
    const updatedOrg=updatedOrgRef.data()
    console.log(updateorg.name)//输出新的和改进的名称
    }
    捕获(错误){handleError(错误)}
    
    引发的错误可能是本地缓存的某个错误,也可能是服务器错误,例如Firestore规则(联机时)返回的权限错误。显然,在离线模式下服务器的任何错误都会自动失败,即使应用程序重新联机


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

    好的,我明白了。我该如何找到用.add()创建的对象的ID?这听起来像是另一个问题,可以单独问。你说得对。很抱歉,没有说得足够具体: