Два быстрых последовательных вызова wf: insert_bottom заканчиваются в обратном порядке - PullRequest
1 голос
/ 05 января 2010

Используя Азот, веб-инфраструктуру 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().

Устанавливается как обычный способ для кометы:

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 - нет. Когда они находятся в неправильном порядке, они, кажется, всегда находятся в неправильном порядке, это кажется очень детерминированным.

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

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

1 Ответ

1 голос
/ 05 января 2010

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

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


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

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

...