Что выведет код Senior Dart: Future, Stream, изоляты обновлено

Dart: микрозадачи обгоняют таймер

Вопрос

Что выведет программа? По строке на каждый вывод.

import 'dart:async';


void main() {
  var n = 0;
  void tick() {
    n++;
    if (n < 3) scheduleMicrotask(tick);
    print('micro $n');
  }

  Future(() => print('таймер, n = $n'));
  scheduleMicrotask(tick);
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: micro 1, micro 2, micro 3, таймер, n = 3. Таймер поставлен раньше, но это событие.

Что выведет

micro 1
micro 2
micro 3
таймер, n = 3

Разбор

Таймер поставлен раньше, но это событие. Микрозадача tick ставит следующую микрозадачу, а очередь микрозадач опустошается полностью, включая добавленные по ходу. Только когда цепочка закончилась, выполняется таймер. Если бы цепочка была бесконечной, таймер и кадры Flutter не выполнились бы никогда.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.