Dos llamadas consecutivas rápidas para WF: insert_bottom terminan en el orden inverso

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

  •  18-09-2019
  •  | 
  •  

Pregunta

nitrógeno, el Erlang framework web , tengo el siguiente método que recibe los mensajes y los añade a la parte inferior de un 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().

Se establece como la forma habitual de cometa:

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

Se recibe dos mensajes muy rápidamente:

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

Esto es lo que veo en el código HTML:

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

De alguna manera, que terminó en el orden inverso.

He empezado a añadir temporizador: el sueño () llama a este método. Con 50 milisegundos, que están en el orden correcto, con 20 que no son. Cuando están en el orden incorrecto que parecen estar siempre en el orden incorrecto, parece muy determinista.

Cualquier idea por qué? Es esto un error? Cualquier idea qué debo hacer para conseguir que en el orden correcto aparte de dormir?

pedido en la lista de correo , en caso de que haya más información allí.

¿Fue útil?

Solución

wf_comet.erl tiene una "extraña "llamada inversa después de aplicar inner_collect_content. Mi conjetura es que inner_collect_content solía ser recursiva de cola hace algún tiempo.

Si se aplica el tiempo de espera, los mensajes son recogidos en diferentes bucles, uno por uno, por lo que la orden no se invierte más.


Parece que hay una confirmación fijación del mismo en otro repositorio:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top