Duas rápidas chamadas consecutivas para wf: insert_bottom acabam na ordem inversa

StackOverflow https://stackoverflow.com/questions/2002487

  •  18-09-2019
  •  | 
  •  

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á.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top