Kas ir ģeneratori Dart (sync* un async*) un kā tie darbojas?
sobes.tech AI
Atbilde no AI
Dart ģeneratori ir ir funkcijas, kas atgriež vērtību secību tās ģenerēšanas laikā, nevis visu rezultātu uzreiz. Tiek izmantotas atslēgas vārdi sync* sinhroniem un async* asinhroniem ģeneratoriem.
Sinhroni ģeneratori (sync*)
Tie atgriež objektu ar tipu Iterable. Tiek izmantots atslēgas vārds yield, lai izsniegtu nākamo vērtību. Izpildes plūsma ir apturēta līdz brīdim, kad tiek pieprasīta nākamā vērtība (piemēram, for-in ciklā).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Vērtības izsniegšana
}
}
Asinhroni ģeneratori (async*)
Tie atgriež Stream tipa objektu. Tiek izmantots atslēgas vārds yield, lai izsniegtu nākamo vērtību. Tāpat tiek izmantots yield*, lai izsniegtu visas citas Stream vērtības. Izpildes plūsma ir apturēta un atsākas, kad ir jauns asinhrons notikums.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Asinhrona darba imitācija
yield i; // Vērtības izsniegšana
}
}
Kā tie darbojas:
Pie ģeneratora funkcijas izsaukšanas, tās ķermenis nekavējoties netiek izpildīts. Tiek atgriezts objekts (vai Iterable, vai Stream). Faktiskais izpildījums sākas tikai pēc pirmās vērtības saņemšanas. Kad tiek sasniegts yield, vērtība tiek nodota "ārpus" un funkcijas stāvoklis tiek saglabāts. Izpilde tiek apturēta. Kad tiek mēģināts saņemt nākamo vērtību, izpilde atsākas no vietas, kur tā tika apturēta, līdz nākamajam yield vai funkcijas beigām.
Atšķirības:
| Raksturlielums | sync* (Sinhronais) | async* (Asinhronais) |
|---|---|---|
| Atgriežamais tips | Iterable |
Stream |
| Atslēgas vārdi | sync*, yield |
async*, yield, yield* |
await lietošana |
Nav atļauta | Var būt |
| Apturēšana | Pirms nākamās vērtības pieprasīšanas | Pirms jauna asinhrona notikuma parādīšanās |