在n2o框架中显示来自外部进程的网页信息

时间:2013-12-03 02:28:16

标签: erlang n2o

如何在N2O framefork中显示外部流程的信息。

这样的代码:

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= <<>> },
      ...].

提前致谢。

2 个答案:

答案 0 :(得分:2)

使用 wf:reg wf: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)

答案 1 :(得分:1)

文档建议使用 wf:reg / 1 wf: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. 在现在的异步函数中执行 wf 操作,然后检索排队的操作,清除缓冲区,最后将{flush, Actions}的元组发送到您的父进程。 / p>

    update(Pid) ->
      %% Your wf:insert..., update, etc. code here
      Actions = wf:actions(),
      wf:actions([]),
      Pid ! {flush, Actions}.
    
  3. 其余的由N2O为你完成:)