【问题标题】:Updating just created collaborative map entries更新刚刚创建的协作地图条目
【发布时间】:2016-05-31 18:38:08
【问题描述】:

我有一个图形编辑器,用户可以选择创建一个节点。它与所有当前选定的节点连接。在谷歌文档中,看起来一个节点(它的字符串标签)被映射到以逗号分隔的一组连接标签。所以,要添加一个节点,我首先创建一个空地图项

map.set(name, "");

然后,分别添加连接项

if (map.get(a) == null) throw new Error("node " + a + " does not exist") // fails here
if (map.get(b) == null) throw new Error("node " + b + " does not exist")
map.set(a, a_connections)
map.set(b, b_connections)

问题在于 map.get 检测到该节点尚未添加到地图中。这需要一些时间。即使在单个 JS 客户端 (read-my-writes inconsistent) 中,操作似乎也是非阻塞的。我应该如何处理它?

我在尝试建立两个连接时注意到了这种不一致(只是为了检测连接何时失败,因为可能会发生连接丢失并且我的所有编辑都不会传播到服务器,我想让用户知道这一点) .

【问题讨论】:

    标签: google-drive-api google-drive-realtime-api collaborative-editing google-realtime-api


    【解决方案1】:

    page 包含有关解决冲突的一些详细信息以及您可以执行哪些操作以将更改一起应用。

    您的示例让我有点困惑,问题/预期行为是什么。

    如果您在同一个同步块内的同一个客户端上执行 map.set("foo", "") 后跟 map.get("foo"),则 get 将始终返回您设置的内容。

    如果您从不同的同步块执行此操作,但在同一个客户端上,只有当另一个客户端更改“foo”的值时,get 才会返回不同的内容。

    如果您在不同的客户端上进行设置并获取,则“foo”的值可能需要任意时间才能传播到其他客户端。您应该能够注册一个侦听器以发现它何时设置。

    如果您想跟踪所有更改何时保留,您可以收听DocumentSaveStateChangedEvents

    【讨论】:

    • 谢谢,我会检查的。但是,我不明白这里会发生哪些冲突。另一个客户端仅用于侦听和清理dirty 状态。我试过DocumentStateChangedEventonly example available is`mRealtimeDocument.addDocumentSaveStateChangedListener(mSaveStateListener`.
    • 但是,记录 mRealtimeDocument.addDocumentSaveStateChangedListener 是未定义的。我可以从文档 onFileLoad 事件中获取doc.getModel().getRoot(),但该文档没有 addStateChangeListener。
    • 我猜这是因为我为两个实时客户端共享相同的代码。当我在不同的浏览器选项卡中编辑图表时,当每个网页只建立一个文档连接时,不会发生这种不一致。
    猜你喜欢
    • 2020-04-26
    • 2012-04-26
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多