Zwei schnelle aufeinanderfolgende Anrufe wf: insert_bottom in umgekehrter Reihenfolge am Ende

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

  •  18-09-2019
  •  | 
  •  

Frage

Mit Stickstoff, den Erlang-Web-Framework , ich habe die folgende Methode, die Nachrichten empfängt und fügt sie den Boden ein hTML-Element:

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().

Es ist, als die übliche Art und Weise für Kometen gesetzt:

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

Es erhält zwei Nachrichten sehr schnell:

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

Dies ist, was ich in der HTML sehen:

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

Irgendwie sie endete in der umgekehrten Reihenfolge.

ich angefangen habe das Hinzufügen Timer: sleep () ruft diese Methode. Mit 50 Millisekunden, sind sie in der richtigen Reihenfolge, mit 20 sind sie nicht. Wenn sie in der falschen Reihenfolge sind, scheinen sie immer in der falschen Reihenfolge zu sein, scheint es sehr deterministisch.

Irgendwelche Ideen, warum? Ist das ein Fehler? Irgendwelche Ideen, was soll ich tun, um sie in der richtigen Reihenfolge andere als schlafen?

Auch auf der Mailingliste gefragt, falls es weitere Informationen gibt.

War es hilfreich?

Lösung

wf_comet.erl hat eine „seltsame "reverse Anruf nach inner_collect_content Anwendung. Meine Vermutung ist, dass inner_collect_content vor seinen Schwanz-rekursive einmal verwendet wird.

Wenn Sie das Timeout anwenden, Ihre Nachrichten in verschiedenen Schleifen gesammelt werden, one-by-one, so dass der Auftrag nicht mehr rückgängig gemacht wird.


Es scheint eine verpflichten, dies auf ein anderes Repository zur Festsetzung:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top