1

我评估 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 参数的第一种方法行为不端?

4

1 回答 1

0

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

例如 :

type cloud_message = {
  sheet_name : string
  row : int
  col : int
  content : string
}

然后,只在顶层创建一次云:

@publish my_cloud = Network.cloud("my_cloud") : Network.network(cloud_message)

最后,在您的 keyboard_update 中,调用:

Network.broadcast({sheet_name=... row=... col=... content=...}, my_cloud)
于 2011-09-12T10:00:04.413 回答