Completer.sync în Dart

Completer care anunță ascultătorii imediat, în timpul apelului complete, nu mai târziu.

Sintaxă
factory Completer<T>.sync()

Ce face Completer.sync

La un Completer obișnuit, complete doar programează anunțarea celor care așteaptă; ei rulează puțin mai târziu, ca microtask. La Completer.sync(), ascultătorii rulează imediat, înainte ca complete să se întoarcă.

Este o optimizare pentru biblioteci, folosită când complete este chemat deja dintr-un context asincron. Folosit greșit, codul poate rula într-o ordine surprinzătoare; în codul obișnuit preferă Completer().

Ce returnează

Un completer sincron.

Exemple

Exemplul 1: Diferența de ordine

import 'dart:async';

Future<void> main() async {
  final normal = Completer<String>();
  normal.future.then((v) => print('  ascultător normal: $v'));
  print('complete pe normal');
  normal.complete('A');
  print('după complete (normal)');
  await Future.delayed(Duration.zero);

  final sincron = Completer<String>.sync();
  sincron.future.then((v) => print('  ascultător sync: $v'));
  print('complete pe sync');
  sincron.complete('B');
  print('după complete (sync)');
}

Rezultat

complete pe normal
după complete (normal)
  ascultător normal: A
complete pe sync
  ascultător sync: B
după complete (sync)

Exemplul 2: Folosire corectă: complete chemat dintr-un callback asincron

import 'dart:async';

Future<int> calculeaza() {
  final c = Completer<int>.sync();
  Timer(const Duration(milliseconds: 10), () => c.complete(6 * 7));
  return c.future;
}

Future<void> main() async {
  print(await calculeaza());
}

Rezultat

42

Greșeli frecvente

  • Folosești Completer.sync și chemi complete în mijlocul unui cod care încă modifică date. Ascultătorii rulează pe loc și pot vedea datele pe jumătate actualizate.

Comenzi înrudite

  • Completer: Creează un Future pe care îl termini tu, manual, mai târziu; leagă codul cu callback-uri de codul cu await.
  • Completer.complete: complete termină future-ul cu o valoare, completeError cu o eroare; isCompleted spune dacă s-a terminat deja.
  • scheduleMicrotask: Programează o funcție să ruleze imediat după codul sincron curent, înaintea timerelor și a altor evenimente.