Due rapidi chiamate consecutive WF: insert_bottom finiscono in ordine inverso

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

  •  18-09-2019
  •  | 
  •  

Domanda

azoto, l'Erlang framework web , ho il seguente metodo che riceve i messaggi e li aggiunge al fondo di 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().

Si è impostato come il modo consueto per la cometa:

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

Si riceve due messaggi molto rapidamente:

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

Questo è quello che vedo nel codice HTML:

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

In qualche modo, si è concluso in ordine inverso.

Ho iniziato ad aggiungere il timer: sleep () chiama a questo metodo. Con 50 millisecondi, sono nell'ordine corretto, con 20 non lo sono. Quando sono in ordine non corretto sembrano essere sempre in ordine non corretto, sembra molto deterministica.

Tutte le idee perché? è un insetto? Tutte le idee che cosa devo fare per farli nell'ordine corretto altro che dormire?

chiesto sulla mailing list , nel caso ci sia maggiori informazioni qui.

È stato utile?

Soluzione

wf_comet.erl ha una "strana "chiamata inversa dopo l'applicazione inner_collect_content. La mia ipotesi è che inner_collect_content usato per essere ricorsiva in coda qualche tempo fa.

Se si applica il timeout, i messaggi vengono raccolti in diversi cicli, uno per uno, quindi l'ordine non è invertito più.


Sembra che ci sia un commit fissare questo su un altro repository:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top