在OPA中,为什么从不同页面多次调用Network.cloud(“key”)会返回不同的云?

在OPA中,为什么从不同页面多次调用Network.cloud(“key”)会返回不同的云?,opa,Opa,我评估OPA以创建实时协作电子表格(来源: ) 我希望人们在电子表格上实时调用Roborate,我希望为每个电子表格创建一个Network.cloud,以便向查看电子表格的所有用户传达更新 每个单元格都是一个键盘\u更新(事件、表名、行、列)}/> 当调用keyboard\u update时,我想在电子表格的云上广播一条消息,以便其他查看器得到更新。但我的问题是: keyboard_update(event,sheetname,row,column) = ( Network.broadc

我评估OPA以创建实时协作电子表格(来源: )

我希望人们在电子表格上实时调用Roborate,我希望为每个电子表格创建一个Network.cloud,以便向查看电子表格的所有用户传达更新

每个单元格都是一个
键盘\u更新(事件、表名、行、列)}/>

当调用
keyboard\u update
时,我想在电子表格的云上广播一条消息,以便其他查看器得到更新。但我的问题是:

keyboard_update(event,sheetname,row,column) = (
    Network.broadcast({/*my update notif message*/}, Network.cloud(sheetname))
)
这就像每次调用时都会创建一个新的网络,即使network.cloud的API文档说:

当一个或多个服务器使用相同的值k调用Network.cloud(k)时,实际上只创建了一个网络

我找到的唯一解决方案是在存储在全局可变列表中的关联列表中为云编制索引:

clouds = Mutable.make([] : list((string,Network.network(message))))
并使用List.assoc获取my cloud,并最终在必要时将其添加到索引中(请参阅源代码中的函数getcloud)


为什么我的第一种使用Network.cloud(sheetname)作为Network.broadcast参数的方法有问题?

我认为您不应该为每个单元格创建新的云。 您应该只为整个文档或webapp创建一个云,并发送不同类型的消息:

例如:

type cloud_message = {
  sheet_name : string
  row : int
  col : int
  content : string
}
然后,只在顶层创建一次云:

@publish my_cloud = Network.cloud("my_cloud") : Network.network(cloud_message)
最后,在键盘更新中,调用:

Network.broadcast({sheet_name=... row=... col=... content=...}, my_cloud)

但是如果你真的想创建多个云,你至少应该使用一个stringmap(Network.Network(message)),它将使用对特定云的即时访问。我没有使用map,因为我在API文档中读到字符串映射是不可变的:
一个不可变的数据结构
。我误解了吗?我不认为使用StringMap或List作为可变数据结构有什么区别。我认为
不可变数据结构
意味着不能仅使用StringMap更新它。添加示例谢谢,为了解释,我将尝试将其转换为StringMap,这样肯定会更简单。事实上,我没有每个单元一个云,每个文档一个云,但我有多个文档,因此我需要多个云。我以为Network.cloud在每次调用时都会创建一个新云。我的错。