Duas rápidas chamadas consecutivas para wf: insert_bottom acabam na ordem inversa
Pergunta
Usando nitrogênio, o framework web Erlang , eu tenho o seguinte método que recebe mensagens e adiciona-los para o fundo de um elemento 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().
Ela é definida como a maneira usual para cometa:
wf:comet(fun() -> receive_messages() end)
Ele recebe duas mensagens muito rapidamente:
<0.907.0> received {starting_chat,<0.905.0>}
<0.907.0> received {connected_to,<0.902.0>}
Isto é o que eu vejo no HTML:
{connected_to, <0.902.0>}
{starting_chat, <0.905.0>}
De alguma forma, eles acabaram na ordem inversa.
Eu comecei adicionando temporizador: sleep () chama a este método. Com 50 milissegundos, eles estão na ordem correta, com 20 eles não são. Quando eles estão na ordem incorreta eles parecem estar sempre na ordem incorreta, parece muito determinista.
Qualquer idéia porque? Isso é um inseto? Todas as idéias que eu deveria fazer para obtê-los na ordem correta diferente de dormir?
pediu na lista de discussão , no caso de haver mais informações lá.
Solução
wf_comet.erl tem um "estranho "chamada reversa após a aplicação inner_collect_content. Meu palpite é que inner_collect_content costumava ser cauda-recursivo há algum tempo atrás.
Se você aplicar o limite de tempo, suas mensagens são coletadas em diferentes loops, um por um, então a ordem não for revertida mais.
Parece haver uma consolidação fixação deste em outro repositório:
http://github.com/gersh/nitrogen/commit/a8bfcb23d003e68f7394a0455285beeb0fbf9b09