Deux appels consécutifs rapides à Wf: fin insert_bottom dans l'ordre inverse

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

  •  18-09-2019
  •  | 
  •  

Question

Utilisation azote, le framework web Erlang, je la méthode suivante qui reçoit les messages et les ajoute au fond d'un élément 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().

Il est défini comme la manière habituelle de la comète:

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

Il reçoit deux messages très rapidement:

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

est ce que je vois dans le code HTML:

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

D'une certaine façon, ils ont fini dans l'ordre inverse.

J'ai commencé à ajouter minuterie: appels sleep () à cette méthode. Avec 50 millisecondes, ils sont dans le bon ordre, avec 20 ils ne sont pas. Quand ils sont dans l'ordre incorrect, ils semblent toujours être dans l'ordre incorrect, il semble très déterministe.

Toutes les idées pourquoi? Est-ce un bug? Toutes les idées que dois-je faire pour les obtenir dans l'ordre correct autre que dormir?

demandé sur la liste de diffusion , au cas où il y a plus d'informations là-bas.

Était-ce utile?

La solution

wf_comet.erl a une « étrange "appel inverse après l'application inner_collect_content. Je pense que inner_collect_content l'habitude d'être il y a quelque temps récursive.

Si vous appliquez le délai d'attente, vos messages sont collectés dans différentes boucles, un par un, de sorte que l'ordre est inversé ne plus.


Il semble y avoir un engagement de fixation ceci sur un autre référentiel:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top