Erlang 两次快速连续调用wf:insert_bottom end up,顺序相反

Erlang 两次快速连续调用wf:insert_bottom end up,顺序相反,erlang,nitrogen,Erlang,Nitrogen,使用,我有以下方法接收消息并将其添加到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()

使用,我有以下方法接收消息并将其添加到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().
设置为comet的常规方式:

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毫秒时则不正确。当它们以错误的顺序排列时,它们似乎总是以错误的顺序排列,这似乎是非常确定的

你知道为什么吗?这是虫子吗?除了睡觉,我还能做些什么让他们保持正确的顺序

另外,如果有更多信息。

在应用内部收集内容后会有一个“奇怪”的反向调用。我的猜测是,内部收集的内容以前是尾部递归的

如果应用超时,您的消息将在不同的循环中逐个收集,因此顺序不再颠倒


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

在应用内部收集内容后有一个“奇怪”的反向调用。我的猜测是,内部收集的内容以前是尾部递归的

如果应用超时,您的消息将在不同的循环中逐个收集,因此顺序不再颠倒


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