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 ドキュメントに次のように記載されていても、呼び出しごとに新しいネットワークが作成されるように動作します。

「1 つまたは複数のサーバーが同じ値 k で Network.cloud(k) を呼び出すと、実際に作成されるネットワークは 1 つだけです」

私が見つけた唯一の解決策は、グローバルミュータブルに保存されている連想リストで雲にインデックスを付けることです:

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

そして、List.assoc を使用してクラウドを取得し、必要に応じて最終的にインデックスに追加します (ソース コードの関数 getcloud を参照)。

Network.cloud(sheetname) を Network.broadcast のパラメーターとして使用する最初のアプローチが誤動作するのはなぜですか?

4

1 に答える 1

0

セルごとに新しいクラウドを作成する必要はないと思います。ドキュメント全体、またはおそらく webapp に対して 1 つのクラウドを作成し、さまざまな種類のメッセージを送信する必要があります。

例えば ​​:

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

そして、最上位でクラウドを 1 回だけ作成します。

@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 に答える