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

时间:2011-09-12 09:42:57

标签: opa

我评估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)时,实际上只创建了一个网络”

我找到的唯一解决方案是将我的云编入一个关联列表中,该列表存储在一个全局可变项中:

clouds = Mutable.make([] : list((string,Network.network(message))))

使用List.assoc获取我的云,并在必要时最终将其添加到索引中(请参阅源代码中的函数getcloud)。

为什么我第一次使用Network.cloud(sheetname)作为Network.broadcast参数的行为是错误的?

1 个答案:

答案 0 :(得分: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)