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