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 გამოყენება შეუძლებელია შესაძლებელია
შეჩერება მოთხოვნის შემდეგი მნიშვნელობისთვის ახალი ასინქრონული მნიშვნელობის გამოჩენის წინ