void callback()
) Runs a function asynchronously.
Callbacks registered through this function are always executed in order and are guaranteed to run before other asynchronous events (like Timer events, or DOM events).
Warning: it is possible to starve the DOM by registering asynchronous callbacks through this method. For example the following program runs the callbacks without ever giving the Timer callback a chance to execute:
main() {
Timer.run(() { print("executed"); }); // Will never be executed.
foo() {
scheduleMicrotask(foo); // Schedules [foo] in front of other events.
}
foo();
}
Other resources
-
The Event Loop and Dart: Learn how Dart handles the event queue and microtask queue, so you can write better asynchronous code with fewer surprises.
Source
/**
* Runs a function asynchronously.
*
* Callbacks registered through this function are always executed in order and
* are guaranteed to run before other asynchronous events (like [Timer] events,
* or DOM events).
*
* **Warning:** it is possible to starve the DOM by registering asynchronous
* callbacks through this method. For example the following program runs
* the callbacks without ever giving the Timer callback a chance to execute:
*
* main() {
* Timer.run(() { print("executed"); }); // Will never be executed.
* foo() {
* scheduleMicrotask(foo); // Schedules [foo] in front of other events.
* }
* foo();
* }
*
* ## Other resources
*
* * [The Event Loop and Dart](https://www.dartlang.org/articles/event-loop/):
* Learn how Dart handles the event queue and microtask queue, so you can write
* better asynchronous code with fewer surprises.
*/
void scheduleMicrotask(void callback()) {
if (identical(_ROOT_ZONE, Zone.current)) {
// No need to bind the callback. We know that the root's scheduleMicrotask
// will be invoked in the root zone.
_rootScheduleMicrotask(null, null, _ROOT_ZONE, callback);
return;
}
Zone.current.scheduleMicrotask(
Zone.current.bindCallback(callback, runGuarded: true));
}