2012-11-06 20 views
5

Ich entdeckte durch das Experimentieren, dass die Erstellung eines Timers mit einer Dauer von 0 mir Arbeit in die Ereigniswarteschlange verschieben kann. Ich mag diese Funktion sehr, da sie viele unangenehme Reentrancy-Probleme vermeidet. Wird sich diese intentionale Funktionalität nicht ändern? Kann es zur Dokumentation hinzugefügt werden? Wenn nicht, gibt es einen unterstützten Weg, dies zu tun?Dart: Verwendet einen Null-Zeit-Timer die unterstützte Möglichkeit, Arbeit auf die Ereignisschleife zu verzögern

Antwort

5

Aktuelle Antwort

Der richtige Weg, dies mit scheduleMicrotask(Function callback) zu tun ist.

die API-Dokumentation finden Sie hier: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async#id_scheduleMicrotask

Ein großer Artikel über Asynchron-Aufgaben und der Ereignisschleife ist hier: https://www.dartlang.org/articles/event-loop/

Alte Antwort (pre Dart 1.0)

Vorerst ist die Antwort Ja, new Timer(0, callback) ist der einfachste Weg, einen Funktionsaufruf zu verschieben.

Bald wird hoffentlich http://dartbug.com/5691 behoben werden und es wird einen besseren Weg geben. Das Problem mit Timer ist, dass die HTML-Spezifikation besagt, dass der Rückruf frühestens 4 ms später erfolgen sollte. Abhängig davon, was Sie tun, kann das Problem auftreten.

Microsoft eingeführt setImmediate(), um dies zu lösen. Es ruft den Rückruf zu Beginn der nächsten Ereignisschleife nach Neuzeichnungen auf. Meine bevorzugte Lösung in Dart ist Future.immediate() Verzögerung bis zur nächsten Ereignisschleife und möglicherweise eine Funktion wie defer(), die einen Rückruf nimmt.

Aber new Timer(0, f) wird noch funktionieren, auch nachdem eine bessere Lösung verfügbar ist. Es würde mir aber nichts ausmachen, wenn ich davor warne.

+0

Yuck, die 4ms Verzögerung ist bedauerlich. "verzögern" (und mit Future.immediate es verwenden) hört sich toll an. Für den Moment kann ich eine Verzögerungsfunktion programmieren, die es mit einem Timer vortäuscht. Ich denke, das ist sehr wichtig. In Ihrem Forward-Call zurückgerufen zu werden, hat immer zu kniffligen Fehlern in ereignisgesteuertem Code geführt. Eine andere Sache, die cool wäre, ist in der Lage zu schaffen, ein dringendes Ereignis, das "die Warteschlange springt". Manchmal möchten Sie dies tun, um den Status unmittelbar vor der Verarbeitung von Ereignissen in der Warteschlange ändern zu können. –

+0

Ich habe meine Antwort aktualisiert, um den aktuellen Status der asynchronen APIs widerzuspiegeln, was viel besser ist. Ich glaube, die 4ms Verzögerung sollte jetzt auf allen unterstützten Browsern (IE 10+) vorbei sein. –