Два быстрых последовательных вызова wf:insert_bottom завершаются в обратном порядке

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

  •  18-09-2019
  •  | 
  •  

Вопрос

Используя Азот, веб-фреймворк Erlang, У меня есть следующий метод , который получает сообщения и добавляет их в нижнюю часть 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 - нет.Когда они расположены в неправильном порядке, кажется, что они всегда находятся в неправильном порядке, это кажется очень детерминированным.

Есть какие-нибудь идеи, почему?Это ошибка?Есть идеи, что мне следует сделать, чтобы расположить их в правильном порядке, кроме сна?

Также задано в списке рассылки, на случай, если там есть больше информации.

Это было полезно?

Решение

wf_comet.erl имеет "странный" обратный вызов после применения inner_collect_content.Я предполагаю, что inner_collect_content некоторое время назад был хвостово-рекурсивным.

Если вы применяете тайм-аут, ваши сообщения собираются в разных циклах, одно за другим, так что порядок больше не меняется на противоположный.


Кажется, есть фиксация, исправляющая это в другом репозитории:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top