如何在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= <<>> },
...].
提前致谢。
答案 0 :(得分:2)
使用 wf:reg 和 wf:flush 功能。示例:/samples/apps/review/src/index.erl
注册页面进程的唯一名称:
23: event(init) -> wf:reg(room)...
更新DOM:
60: wf:insert_bottom(history, Terms)
使用页面进程名称刷新对浏览器的更改:
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的代码检查后,我认为有一个非常简单的解决方案:
从可以呈现操作的进程(例如websocket进程)开始,生成所需的函数并将父进程id作为其参数之一传递
async_render() ->
Pid = self(),
spawn(fun() -> update(Pid) end).
在现在的异步函数中执行 wf 操作,然后检索排队的操作,清除缓冲区,最后将{flush, Actions}
的元组发送到您的父进程。 / p>
update(Pid) ->
%% Your wf:insert..., update, etc. code here
Actions = wf:actions(),
wf:actions([]),
Pid ! {flush, Actions}.
其余的由N2O为你完成:)