本地修改数据的 Firebase 同步:处理错误和全局状态

2023-12-21

我有两个相关问题Firebase 网络平台 https://www.firebase.com/docs/web/'s 将本地修改的数据同步到服务器 https://www.firebase.com/docs/web/guide/offline-capabilities.html#section-local:

共享 Firebase 数据库的每个客户端都会维护自己的任何活动数据的内部版本。 更新或保存数据时,会将其写入数据库的本地版本。 然后,Firebase 客户端会“尽最大努力”将该数据与 Firebase 服务器和其他客户端同步。


1. 处理同步错误

数据修改方法 (set() https://www.firebase.com/docs/web/api/firebase/set.html, remove() https://www.firebase.com/docs/web/api/firebase/remove.html, ETC) 可以采取onComplete回调参数:

同步到 Firebase 服务器时将调用的回调函数 已完成。回调将传递一个Error反对失败;别的null.

var onComplete = function(error) {
  if (error) {
    console.log('Synchronization failed');
  } else {
    console.log('Synchronization succeeded');
  }
};

fredRef.remove(onComplete);

在上面的例子中,应该出现什么样的错误fredRef.remove()期望收到回调?

  • Temporary errors?
    • 客户端离线(网络连接丢失)?
    • Firebase 服务器暂时超载或停机进行维护,但很快就会再次可用?
  • Permanent errors?
    • 权限被拒绝(由于安全规则 https://www.firebase.com/docs/security/guide/securing-data.html) ?
    • 数据库位置不存在?

有没有办法区分暂时性错误和永久性错误?

我们应该如何处理/从这些错误中恢复?

对于临时错误,我们是否需要调用fredRef.remove()过一段时间后再次重试该操作?


2. 全局同步状态

我意识到每次打电话set() and remove()将收到单独的同步成功/失败信息 结果是onComplete打回来。但我正在寻找一种方法来确定整个 Firebase 客户端的全局同步状态.

我想用一个beforeunload https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload事件监听器 在所有修改的数据同步到服务器之前尝试离开页面时警告用户, 我正在寻找一些类似的功能firebase.isAllModifiedDataSynced()。像这样的事情:

window.addEventListener('beforeunload', function (event) {
    if (!firebase.isAllModifiedDataSynced()) {
        event.returnValue = 'Some changes have not yet been saved. If you ' +
                            'leave this page, your changes will be lost.';
    }
});

以下是 Google 云端硬盘中相同功能的示例:

我知道special /.info/connected地点 https://www.firebase.com/docs/web/guide/offline-capabilities.html#section-connection-state:

对于客户端来说,了解其何时在线或离线非常有用。 Firebase 客户端提供一个特殊位置:/.info/connected每次客户端连接状态发生变化时都会更新。 这是一个例子:

var connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    alert("connected");
  } else {
    alert("not connected");
  }
});

特别的/.info/connected位置可以连接到beforeunload事件监听器如下:

var connectedRef = new Firebase('https://myapp.firebaseio.com/.info/connected');
var isConnected  = true;

connectedRef.on('value', function (snap) {
    isConnected = snap.val();
});

window.addEventListener('beforeunload', function (event) {
    if (!isConnected) {
        event.returnValue = 'Some changes have not yet been saved. If you ' +
                            'leave this page, your changes will be lost.';
    }
});

我的问题是:

  • If isConnected is true, 这是否也意味着所有修改的数据都已同步到服务器?
  • 即是否“连接的”也意味着"synced"?

如果不是,应用程序如何确定整个 Firebase 客户端的全局同步状态?

  • 有没有特别的/.info/synchronized地点?
  • 应用程序是否需要手动跟踪每个同步的成功/失败结果onComplete打回来?

在上面的示例中,fredRef.remove() 回调应该收到什么样的错误?

客户端离线(网络连接丢失)?

不,这不会导致错误传递到完成侦听器。它只会导致完成侦听器(尚未)被调用。

Firebase 服务器暂时超载或停机进行维护,但很快就会再次可用?

不会。这本质上与没有网络连接相同。

权限被拒绝(由于安全规则)?

是的,这确实会导致错误传递给完成处理程序。

数据库位置不存在?

不,这不会导致完成侦听器出现错误。

如果isConnected为true,是否也意味着所有修改的数据都已经同步到服务器了?即“连接”也意味着“同步”吗?

不,不是的。.info/connected当与数据库建立连接时将触发 true。

如果不是,应用程序如何确定整个 Firebase 客户端的全局同步状态?

目前无法确定您的本地数据是否与服务器保持同步。

是否有特殊的 /.info/synchronized 位置?

不,这样的位置不存在。

应用程序是否需要手动跟踪每个 onComplete 回调的同步成功/失败结果?

这取决于用例。但是,如果您只想知道所有写入何时执行,请推送一个虚拟值并等待其完成。由于 Firebase 按顺序执行写入,因此您可以确定在该阶段您已经获得了其他事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

本地修改数据的 Firebase 同步:处理错误和全局状态 的相关文章

  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • 将 firebase auth 与 google app engine 云端点集成

    有人可以指定 使用一些示例代码 如何验证谷歌云端点中的 firebase 令牌吗 最近提出的问题根本没有澄清 如何将 Firebase 身份验证与 Google 应用引擎端点集成 https stackoverflow com questi
  • jQuery UI Datepicker 奇怪的行为

    我在使用 jqueryUI 使用简单的日期选择器时遇到了一个奇怪的问题 我只想显示两个月的日历 包括上个月和当前月份 我使用了这段代码 function picker datepicker numberOfMonths 2 showCurr
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • Chrome 开发工具命中代码但未命中断点

    我在 chrome 开发工具上启用了断点 并且在一行上有一个断点 我知道 chrome 正在运行 因为我将断点放在具有以下语句的行上 alert why is this not breaking 如果我在本地主机中找到该文件 则断点有效 断
  • 角度垫排序不适用于带点表示法的 matColumnDef

    我正在尝试按列对表进行排序 当我必须过滤另一个结果中的结果时 就会出现问题 我尝试通过括号表示法和点表示法访问该属性 但没有给出结果 还将最终节点放置在 matColumnDef 中 但失败 因为有 2 列同名 table table
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • 从对象中取出具有无效(NaN、空白等)值的键的最佳方法?

    我有一个供用户填写的简短搜索表单 将有多个搜索查询进入 MongoDB 该表单创建一个名为的变量searchParams可能看起来像这样 var searchParams city Springfield bedrooms 3 bathro
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https
  • fadeOut() 和slideUp() 同时进行?

    我已经发现jQuery 淡出然后滑动 https stackoverflow com questions 734554 jquery fadeout then slideup这很好 但不是那个 我怎么能够fadeOut and slideU
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 如何调试超时等待异步 Angular 任务?无法在角度页面上找到元素

    编辑 请注意 在 ernst zwingli 的帮助下 我找到了问题的根源 因此 如果您遇到相同的错误 他指出的修复之一可能会帮助您 我的问题是量角器本身的一个已知问题 如果您认为这可能是您 我已经扩展了我的步骤 以在我最初的问题之后查明问
  • InAppMessage 一旦显示就会自动消失

    您好 我最近将 InAppMessaging 添加到我的项目中 这似乎很容易集成 但对我来说并没有按预期工作 首先 我将其添加到 build gradle 中 implementation com google firebase fireb
  • 如何在具有相同值的下拉菜单上触发 jQuery 更改事件

    即使用户选择相同的值 如何每次都触发 jQuery 更改事件 我需要刷新效果 例如如果用户选择Lawyer它会发出警报hello然后用户再次选择Lawyer从下拉菜单中 它应该发出警报hello 我怎样才能实现它 以下是代码 jQuery
  • 引用自身的 Javascript 对象...有问题吗?

    由于 Javascript 允许通过引用分配复合值 因此如果 Javascript 对象引用自身 它将创建无限的引用集 如控制台中所示 这看起来像是某种无限循环 但 Chrome 似乎没有问题 这样做是否存在任何内存问题或其他风险 就记忆力
  • AngularStrap 工具提示禁用我的自定义指令

    我正在尝试让 bs tooltip AngularStrap 指令与我自己的名为 checkStrength 的自定义指令一起使用 该指令检查密码的强度 单独使用这些指令中的任何一个时 它们都可以正常工作 但不能一起工作 This http
  • 使 Bootstrap Popover 在悬停而不是单击时出现/消失

    我正在使用 Bootstrap 构建一个网站Popover http twitter github com bootstrap javascript html popovers我不知道如何使弹出窗口出现在悬停而不是单击时 我想做的就是当有人
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传

随机推荐

  • Java 7 Kerberos 问题 - AES128 校验和损坏

    我正在从 Java 6 迁移到 Java 7 并且遇到了 Kerberos 身份验证问题 在我看来 底层加密类型顺序已被切换 因此使用了不同的加密类型 在这种情况下Aes128CtsHmacSha1EType当 Java 7 运行时 将用于
  • 设置 double 中点后的位数

    在 C double 类型中 如何设置点后的位数 我只需要 4 谢谢 你不能 二进制浮点数 http pobox com skeet csharp floatingpoint html不是那样的 你可以format这样就可以加倍 例如使用
  • Laravel 验证属性“好名字”

    我正在尝试使用 语言 gt 语言 gt validation php 中的验证属性来替换 属性名称 输入名称 以获得正确的读取名称 例如 first name gt 名字 使用起来似乎很简单 但验证器不会显示 好名字 我有这个 attrib
  • Turbo CPP 中的鼠标程序

    我用turbo cpp编写了一个程序 它使用鼠标作为基本的GUI 我还编写了一个函数来确定鼠标是否单击了某个位置显示的某个文本 第一次运行时一切正常 但是当我第二次运行该程序时 出现了问题 即使鼠标刚刚经过一个选项 而不是单击 它也会被选中
  • 连接到 AWS IoT MQTT 主题的客户端数量

    我们开发了一个 iOS 应用程序 并将该应用程序配置为侦听 AWS IoT 上特定 MQTT 主题上发布的所有消息 我想知道的是 有没有办法可以提取正在收听该主题的已连接设备的列表 我检查了cloudWatch日志 但找不到详细信息 例如所
  • Excel VSTO Addin 显示/隐藏任务窗格

    我在这里做教程 空白 Excel 页面一切正常 https msdn microsoft com en us library bb608590 v vs 120 aspx https msdn microsoft com en us lib
  • 如果我们需要更改 input_shape,为什么需要 include_top=False ?

    据我所知 输入元组是从卷积块进入的 因此 如果我们想改变 input tuple 的形状 修改卷积就有意义 为什么我们需要 include top False 并删除最后的全连接层 另一方面 如果我们有不同数量的类 Keras 可以选择使用
  • 如何在 Firebase 中验证转义的基于电子邮件的用户帐户?

    我正在使用 Firebase 简单登录的电子邮件 密码身份验证选项 我使用转义电子邮件作为键来存储用户数据 其中 字符已替换为 因为 Firebase 不允许在键中存储 而不是使用用户 ID 作为键 问题是 在安全规则中 我无法使用正则表达
  • System.NullReferenceException:未将对象引用设置为对象的实例[重复]

    这个问题在这里已经有答案了 可能的重复 NET 中的 NullReferenceException 是什么 https stackoverflow com questions 4660142 what is a nullreferencee
  • C# 桌面应用程序中的会话变量?

    我正在开发一个 C 独立的单用户桌面应用程序 需要用户登录该应用程序 我想确保当 5 分钟左右没有任何活动时 应用程序将提示用户再次登录 我想到了几种解决方案来做到这一点 但似乎效率不高 以前 在进行 Web 编程时 我能够使用会话变量来执
  • 苹果推送通知分发证书签名请求是否需要与分发证书用于签署应用程序的请求相同?

    我有一个已创建的现有应用程序 并且最近配置了推送通知 配置时 系统要求我上传证书签名请求 CSR 我不再拥有用于发布应用程序的原始 CSR 这是我需要上传到推送通知配置才能接收推送通知证书的 CSR 吗 我有带有可用私钥的分发证书 我尝试创
  • Angular 4上的动画似乎没有过渡效果

    trigger expandCollapse state open style height state close style height 0px transition open lt gt close animate 1000 使用此
  • postgres中的SQL将重复事件的日期时间转换为未来的日期时间

    我仅使用日期时间来跟踪表中每周重复发生的事件 我只关心时间和它所在的星期几 我需要能够将设置的 DATETIME 转换为当前或即将到来的未来日期 IE 如何转换存储为的日期2013 02 22 12 00 00使用当前日期到下一次出现的日期
  • 这种不良做法/反模式的名称是什么?

    我试图向我的团队解释为什么这是不好的做法 并且正在寻找反模式参考来帮助我的解释 这是一个非常大的企业应用程序 因此这里有一个简单的示例来说明所实现的内容 public void ControlStuff var listOfThings L
  • 使用 cxf 和 java 第一种方法编写异步服务

    我需要使用 cxf 和 java 第一种方法创建一个异步 Web 服务 但我无法 找到任何可以告诉我如何执行此操作的网络资源 网站吗 您能告诉我如何使用 CXF 和 java 第一种方法编写异步 Web 服务吗 Thanks Shekhar
  • FMDB开放数据库

    我正在尝试打开资源中项目中的数据库 问题是好像找不到数据库文件 我尝试使用完整路径 它有效 但这不是一个好的解决方案 我现在想知道如何打开它 我正在使用这段代码 db FMDatabase databaseWithPath bbdd sql
  • htaccess 从 url 中删除字符并重定向

    我想脱衣 来自网址 例子 mysite com something想要重定向到mysite com something 通过启用 mod rewrite 和 htaccesshttpd conf然后将此代码放入您的 htaccess und
  • Select2:如何防止标签排序

    当用户选择许多项目 标签 时 它们会自动按字母顺序排序 如何使用Select2 4 0防止自动排序并保留用户的顺序 Update 提到的 可能的重复问题 适用于旧版本的 Select2 v3 我询问版本 4 它与旧版本不同 并且提到的答案不
  • flake8 抱怨过滤器子句中的布尔比较“==”

    我在 mysql 数据库表中有一个布尔字段 table model class TestCase Base tablename test cases obsoleted Column obsoleted Boolean 要获取所有未过时测试
  • 本地修改数据的 Firebase 同步:处理错误和全局状态

    我有两个相关问题Firebase 网络平台 https www firebase com docs web s 将本地修改的数据同步到服务器 https www firebase com docs web guide offline cap