2012-11-06 33 views

回答

5

當前回答

正確的方式做,這是scheduleMicrotask(Function callback)

看到這裏的API文檔:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async#id_scheduleMicrotask

對異步任務和事件循環一個偉大的文章是在這裏:https://www.dartlang.org/articles/event-loop/

老答(前的DART 1.0)

就目前來看,答案是是的,new Timer(0, callback)是推遲函數調用的最簡單方法。

很快,希望http://dartbug.com/5691將被修復,並且會有更好的方法。 Timer的問題在於HTML規範說回調應該在4ms之後發生。取決於你在做什麼,可能會有問題。

微軟推出setImmediate()來解決這個問題。它在任何重繪之後在下一個事件循環開始時調用回調。我在Dart的首選解決方案是讓Future.immediate()推遲到下一個事件循環,並可能需要一個回調函數如defer()

但即使在有更好的解決方案後,new Timer(0, f)仍然可以工作。儘管如此,我並不介意它的皮棉警告。

+0

Yuck,4ms的延遲是不幸的。 「推遲」(並有Future.immediate使用它)聽起來不錯。現在,我可以編寫一個延遲函數,用定時器來僞造它。我認爲這非常重要。在您的轉發呼叫中回叫會導致事件驅動代碼中的棘手錯誤。另一件很酷的事情是能夠創建一個「跳過隊列」的緊急事件。有時候你想要做到這一點,以便能夠在處理任何排隊事件之前立即改變狀態。 –

+0

我更新了我的答案以反映異步API的當前狀態,這更好。我相信現在所有支持的瀏覽器(IE 10+)都應該延遲4ms延遲。 –