2012-11-06 60 views
5

Odkryłem eksperymentując, że utworzenie timera o czasie trwania 0 pozwala mi odroczyć pracę do kolejki zdarzeń. Bardzo podoba mi się ta funkcja, ponieważ pozwala uniknąć wielu nieprzyjemnych problemów z powtarzalnością. Czy ta zamierzona funkcjonalność nie ulegnie zmianie? Czy można go dodać do dokumentacji? Jeśli nie, czy jest obsługiwany sposób, aby to zrobić?Dart: Używa timera czasu zerowego obsługiwanego sposobu odraczania pracy do pętli zdarzeń.

Odpowiedz

5

Aktualny Odpowiedź

Właściwym sposobem na to jest z scheduleMicrotask(Function callback).

Zobacz dokumentację API tutaj: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async#id_scheduleMicrotask

ciekawy artykuł na asynchronicznych zadań i pętli zdarzeń jest tutaj: https://www.dartlang.org/articles/event-loop/

Old Answer (pre Dart 1.0)

Na razie odpowiedź brzmi tak, new Timer(0, callback) jest najprostszym sposobem odroczenia wywołania funkcji.

Wkrótce, miejmy nadzieję, zostanie naprawione http://dartbug.com/5691 i będzie lepszy sposób. Problem z Timerem polega na tym, że specyfikacja HTML mówi, że wywołanie zwrotne powinno nastąpić nie wcześniej niż 4 ms później. W zależności od tego, co robisz, może to być problematyczne. W celu rozwiązania tego problemu firma Microsoft wprowadziła . Wywołuje wywołanie zwrotne na początku następnej pętli zdarzeń, po każdym odrysowaniu. Moim preferowanym rozwiązaniem w Dart jest odliczanie do następnej pętli zdarzeń i prawdopodobnie funkcja taka jak defer(), która oddzwoni.

Ale nadal będzie działać new Timer(0, f), nawet po lepszym rozwiązaniu. Nie miałbym jednak nic przeciwko ostrzeżeniu o lintach.

+0

Fuj, opóźnienie 4ms jest niefortunne. "odroczenie" (i posiadanie go przez Future.immediate) brzmi świetnie. Na razie mogę zakodować funkcję odroczenia, która fałszuje ją za pomocą timera. Myślę, że to naprawdę ważne. Ponowne wywołanie połączenia przychodzącego zawsze prowadziło do kłopotliwych błędów w kodzie sterowanym zdarzeniami. Inną rzeczą, która byłaby fajna, jest możliwość stworzenia pilnego wydarzenia, które "przeskoczy kolejkę". Czasami chcesz to zrobić, aby móc zmienić stan bezpośrednio przed przetwarzaniem zdarzeń oczekujących w kolejce. –

+0

Zaktualizowałem swoją odpowiedź, aby odzwierciedlić obecny stan asynchronicznych interfejsów API, który jest znacznie lepszy. Sądzę, że opóźnienie 4ms powinno zniknąć we wszystkich obsługiwanych przeglądarkach teraz (IE 10+). –