Генераторҳо дар Dart (sync* ва async*) чистанд ва чӣ гуна кор мекунанд?
sobes.tech AI
Ҷавоб аз AI
Генераторҳо дар Dart — ин функсияҳое ҳастанд, ки дар вақти истеҳсоли онҳо ба ҷараёни арзишҳо бармегарданд, на ҳамаи натиҷаро якбора. Калидвожаҳои sync* барои генераторҳои синхронӣ ва async* барои асинхронӣ истифода мешаванд.
Генераторҳои синхронӣ (sync*)
Онҳо объекти навъи Iterable-ро бармегардонанд. Калидвожа yield барои додани арзиши оянда истифода мешавад. Тарҳи иҷроиш то он даме, ки арзиши оянда талаб карда шавад, боздошта мешавад (масалан, дар давраи for-in).
Iterable<int> countUpTo(int max) sync* {
for (int i = 1; i <= max; i++) {
yield i; // Додани арзиш
}
}
Генераторҳои асинхронӣ (async*)
Онҳо объекти навъи Stream-ро бармегардонанд. Калидвожа yield барои додани арзиши оянда истифода мешавад. Ҳамчунин yield* барои додани ҳамаи арзишҳои Stream-и дигар истифода мешавад. Тарҳи иҷроиш боздошта мешавад ва дар ҳузури ҳодисаҳои асинхронӣ такрор мешавад.
Stream<int> countUpToAsync(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(milliseconds: 100)); // Имомитсияи кори асинхронӣ
yield i; // Додани арзиш
}
}
Чӣ гуна кор мекунанд:
Ҳангоми даъвати функсияи-генератор, бадани функсия фавран иҷро намешавад. Объект (ё Iterable, ё Stream) баргардонида мешавад. Иҷрои воқеии бадани функсия танҳо вақте оғоз мешавад, ки аввалин бор арзиш гирифтан аз объекти баргардонидашудаи дода шавад. Вақте ки калидвожа yield ба кор мерасад, арзиш ба "баромад" дода мешавад ва ҳолати функсия нигоҳ дошта мешавад. Иҷрои бадани функсия боздошта мешавад. Вақте ки барои гирифтани арзиш дигар кӯшиш мешавад, иҷро аз ҷойи боздошта оғоз мешавад, то ки ба yield ё охири функсия расад.
Фарқиятҳо:
| Хусусият | sync* (Синхронӣ) | async* (Асинхронӣ) |
|---|---|---|
| Навъи баргардондан | Iterable |
Stream |
| Калидвожаҳо | sync*, yield |
async*, yield, yield* |
Истифодаи await |
Манъ аст | Мумкин аст |
| Боздоштан | То талаб кардани арзиши оянда | То пайдоиши арзиши асинхронӣ оянда |