1

如何在 N2O 框架叉中显示来自外部进程的信息。

像这样的代码:

tokyoWeather() ->
     timer:sleep(10000),
     Data = getTokyoWeater(),
     ??? SHOW_ON_PAGES,
     tokyoWeather().
lisbonWeather() ->
     timer:sleep(10000),
     Data = getLisbonWeater(),
     ??? SHOW_ON_PAGES,
     lisbonWeather().

第 1 页:

body() ->
    [ #panel { id=TokyoWeather text= <<>> },
      #panel { id=LisbonWeather, text= <<>> },
      ...].

第2页:

body() ->
    [ #panel { id=TokyoWeather text= <<>> },
      #panel { id=LisbonWeather, text= <<>> },
      ...].

提前致谢。

4

2 回答 2

2

使用wf:regwf:flush函数。示例:/samples/apps/review/src/index.erl

  1. 为页面进程注册唯一名称:

    23: event(init) -> wf:reg(room)...

  2. 更新 DOM:

    60: wf:insert_bottom(history, Terms)

  3. 使用页面进程名称刷新对浏览器的更改:

    62: wf:flush(room)

于 2014-05-26T11:03:04.147 回答
1

文档建议使用wf:reg/1wf:flush。但是,这需要您将进程注册到一个池中,这在您想要一次操作多个进程时很方便,但在其他情况下则非常多余。

N2O 书中提到的另一个有趣的功能是wf:flush/1。它的描述声称它做了一些与wf:flush/0完全不同的事情,而实际上它没有。它实际上只是收集放置在“缓冲区”中的 wf 操作,并通过wf:send/2将它们发送到注册的所谓的 websocket 进程。同时,websocket 进程处于一个定时接收循环中。

经过一些 N2O 的代码检查,我认为有一个非常简单的解决方案:

  1. 从可以呈现操作的进程(例如 websocket 进程)开始,生成所需的函数并将父进程 ID 作为其参数之一传递

    async_render() ->
      Pid = self(),
      spawn(fun() -> update(Pid) end).
    
  2. 在 now 异步函数中执行您的wf操作,然后检索排队的操作,清除缓冲区,最后将元组发送{flush, Actions}到您的父进程。

    update(Pid) ->
      %% Your wf:insert..., update, etc. code here
      Actions = wf:actions(),
      wf:actions([]),
      Pid ! {flush, Actions}.
    

其余的由 N2O 为您完成 :)

于 2016-10-30T21:31:10.340 回答