两次快速连续调用wf:insert_bottom以相反的顺序结束

时间:2010-01-04 21:50:28

标签: erlang nitrogen

使用Nitrogen, the Erlang web framework,我有以下方法接收消息并将它们添加到html元素的底部:

receive_messages() ->
  receive
    Message ->
      io:format("~p received ~p", [self(), Message]),
      wf:insert_bottom(messages, [#p{}, #span { text=io_lib:format("~p", [Message]) }])
  end,
  wf:comet_flush(),
  receive_messages().

它被设定为彗星的通常方式:

wf:comet(fun() -> receive_messages() end)

它很快收到两条消息:

<0.907.0> received {starting_chat,<0.905.0>}
<0.907.0> received {connected_to,<0.902.0>}

这就是我在HTML中看到的:

{connected_to, <0.902.0>}
{starting_chat, <0.905.0>}

不知何故,他们以相反的顺序结束。

我开始添加timer:sleep()调用此方法。在50毫秒的时间内,它们的顺序是正确的,而20则不是。当它们处于不正确的顺序时,它们似乎总是处于不正确的顺序,它似乎非常确定。

任何想法为什么?这是一个错误吗?除了睡觉之外,我应该怎么做才能让它们按照正确的顺序排列?

另外asked on the mailing list,以防有更多信息。

1 个答案:

答案 0 :(得分:1)

应用inner_collect_content后,

wf_comet.erl有一个“奇怪的”反向调用。我的猜测是,inner_collect_content过去曾经是尾递归的。

如果您应用超时,您的消息将逐个收集在不同的循环中,因此订单不再被撤消。


似乎有一个提交在另一个存储库上修复:

http://github.com/gersh/nitrogen/commit/a8bfcb23d003e68f7394a0455285beeb0fbf9b09