Sobes.tech
Middle

Генераторҳо дар 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 Манъ аст Мумкин аст
Боздоштан То талаб кардани арзиши оянда То пайдоиши арзиши асинхронӣ оянда