我评估 OPA 以创建实时协作电子表格(来源: https ://github.com/omarbenhamid/Cloudsheet/blob/master/cloudsheet.opa )
我希望人们在电子表格上实时调用,我想为每个电子表格创建一个 Network.cloud,以便与查看电子表格的所有用户交流更新。
每个单元格是一个<input type="text" onkeypress={event->keyboard_update(event,sheetname,row,column)}/>
当keyboard_update
被调用时,我想在电子表格的云上广播一条消息,以便其他观众得到更新。但这是我的问题:
keyboard_update(event,sheetname,row,column) = (
Network.broadcast({/*my update notif message*/}, Network.cloud(sheetname))
)
这就像在每次调用时创建一个新网络一样,即使 Network.cloud 的 API 文档说:
“当一台或多台服务器调用具有相同 k 值的 Network.cloud(k) 时,实际上只创建了一个网络”
我找到的唯一解决方案是在一个关联列表中索引我的云,该关联列表存储在一个全局 mutable 中:
clouds = Mutable.make([] : list((string,Network.network(message))))
并使用 List.assoc 获取我的云,并在必要时最终将其添加到索引中(请参阅源代码中的函数 getcloud )。
为什么我使用 Network.cloud(sheetname) 作为 Network.broadcast 参数的第一种方法行为不端?