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 колдонуу Болбойт Мүмкүн
Токтотуу Кийинки маанини сураганга чейин Кийинки асинхрон мааниге чейин