13

我最近将我的应用程序从 firebase 更新到了 firestore,但陷入了离线持久性。我正在使用 react-native-firebase 来集成 firestore 并禁用它的持久性,但在没有互联网时仍然没有收到任何捕获错误。这是我删除数据的代码,但是当没有解决承诺时,catch 永远不会出错。

firebase.firestore().collection('d').doc(deviceid).delete().then(function () {
                                    console.log("Device Deleted");
                                    that.setState({
                                        loading: false
                                    });
                                    Toast.show('Device Deleted Succesfully', {
                                        duration: Toast.durations.SHORT,
                                        position: Toast.positions.TOP,
                                        shadow: true,
                                        animation: true,
                                        hideOnPress: true,
                                        delay: 0,
                                    });

                                }).catch(function (err) {
                                    console.log(err);
                                    that.setState({
                                        loading: false
                                    });
                                })
4

3 回答 3

17

Firestore 和实时数据库 SDK 在没有网络连接时不会引发错误。他们将默默地重试连接,希望设备能很快恢复网络连接。这样做的原因是因为大多数开发人员不希望他们的应用程序仅仅因为用户进入隧道然后退出,或者以强制网络重置的方式在移动塔之间切换而出现故障。

为了有效利用在线数据库,设备大部分时间都应该在线,这也是 SDK 正在优化的情况。

于 2018-05-26T13:46:44.170 回答
4

制作您自己的删除辅助函数,如果没有 Internet 连接,则会引发错误。.collection()您可以通过不调用而是将完整路径传递给API 来使 API 更简洁d + deviceid

function onlineOnlyDelete(path) {
  if(!deviceApi.hasInternet()) throw 'No Internet, no delete'
  return firebase.firestore().doc(path).delete()
}

替换firebase.firestore().collection('d').doc(deviceid)onlineOnlyDelete(d+deviceid),你应该很高兴

于 2018-05-27T07:02:26.130 回答
3

引用这个线程。我设置了以下检查:

.then(() => {
  if (snapshot.empty && snapshot.metadata.fromCache) {
     throw new Error('Failed to fetch ideas');
  }
})

然后后来我发现了错误并将应用程序状态设置为包括错误以及特定于批处理的参数,这些参数startIndex稍后stopIndex会很重要。在呈现文档时,为我所称的那样保留了一种情况BatchError,在这种情况下,用户将看到一个Refetch附加了回调的按钮。使用批处理元数据,回调能够重新初始化特定的批处理请求。

于 2020-07-02T00:23:54.113 回答