scheduleMicrotask 函数

void scheduleMicrotask(
  1. void callback()
)

异步执行一个函数。

通过此函数注册的回调总是按顺序执行,并保证在其它异步事件(如 Timer 事件,或 DOM 事件)之前执行。

警告:通过此方法注册异步回调可能会使 DOM 饥饿。例如,以下程序会一直运行回调而不会给 Timer 回调执行的机会

main() {
  Timer.run(() { print("executed"); });  // Will never be executed.
  foo() {
    scheduleMicrotask(foo);  // Schedules [foo] in front of other events.
  }
  foo();
}

其他资源

  • Dart 的事件循环:了解 Dart 如何处理事件队列和微任务队列,以便您能以更少意外的方式编写更好的异步代码。

实现

@pragma('vm:entry-point', 'call')
void scheduleMicrotask(void Function() callback) {
  _Zone currentZone = Zone._current;
  if (identical(_rootZone, currentZone)) {
    // No need to bind the callback. We know that the root's scheduleMicrotask
    // will be invoked in the root zone.
    _rootScheduleMicrotask(null, null, _rootZone, callback);
    return;
  }
  _ZoneFunction implementation = currentZone._scheduleMicrotask;
  if (identical(_rootZone, implementation.zone) &&
      _rootZone.inSameErrorZone(currentZone)) {
    _rootScheduleMicrotask(
        null, null, currentZone, currentZone.registerCallback(callback));
    return;
  }
  Zone.current.scheduleMicrotask(Zone.current.bindCallbackGuarded(callback));
}