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 chemicompleteî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.