В OPA почему множественные вызовы Network.cloud («ключ») с разных страниц возвращают разные облака? - PullRequest
1 голос
/ 12 сентября 2011

Я оцениваю 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))
)

Это ведет себя так же, как новая сеть создается при каждом вызове, даже если API-документ Network.cloud говорит:

«Когда один или несколько серверов вызывают Network.cloud (k) с одинаковым значением k, фактически создается только одна сеть»

Единственное решение, которое я нашел, - индексировать мои облака в ассоциативном списке, который хранится в глобальной изменяемой таблице:

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

И загрузите мое облако с помощью List.assoc и, в случае необходимости, добавьте его в индекс (см. Функцию getcloud в исходном коде).

Почему мой первый подход к использованию Network.cloud (имя листа) в качестве параметра Network.broadcast неверен?

1 Ответ

0 голосов
/ 12 сентября 2011

Не думаю, что вам следует создавать новое облако для каждой ячейки.Вам нужно просто создать одно облако для всего документа или веб-приложения, и отправлять сообщения другого типа:

Например:

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)
...