Sobes.tech
Middle

Dart-da asinxronluq haqqında bilikləriniz nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Dart-də asinxronluq aşağıdakı vasitələrlə həyata keçirilir:

  • "İzolatorlar" (Isolates) konsepti: Müstəqil iş prosesləri, hər biri öz yaddaşına malikdir. Resurs tələbatlı tapşırıqları paralel şəkildə yerinə yetirmək və əsas istifadəçi interfeysinin axınına mane olmamaq üçün istifadə olunur. İzolatorlar arasında əlaqə portlar (ReceivePort, SendPort) vasitəsilə qurulur.

  • Açar sözlər async, await:

    • async funksiyanın asinxron əməliyyatlar həyata keçirəcəyini və Future qaytaracağını göstərir.
    • await async funksiyası daxilində istifadə olunur və Future-ın tamamlanmasını gözləyir. Bu zaman funksiyanın icrası dayandırılır və digər əməliyyatlar yerinə yetirilə bilər, Future isə nəticə və ya xəta ilə tamamlanır.
    Future<String> fetchData() async {
      // Gecikməni simulyasiya edir
      await Future.delayed(Duration(seconds: 2));
      return 'Məlumat alındı';
    }
    
    void main() async {
      print('Başlanğıc');
      String result = await fetchData(); // fetchData-nın tamamlanmasını gözləyirik
      print(result);
      print('Son');
    }
    
  • Future<T> sinfi: Gələcəkdə mövcud olacaq asinxron əməliyyatın nəticəsini təmsil edir. Future üç vəziyyətdə ola bilər:

    • Tamamlanmayıb (uncompleted)
    • Nəticə ilə tamamlanıb (completed with a value)
    • Xəta ilə tamamlanıb (completed with an error)

    Future-ın tamamlanmasını idarə etmək üçün then(), catchError(), whenComplete() və ya await istifadə olunur.

  • Stream<T> sinfi: Asinxron hadisələrin ardıcıllığını təmsil edir. Fayldan oxuma, şəbəkədən məlumat alma, istifadəçi interfeys hadisələri kimi məlumat axınlarının işlənməsi üçün istifadə olunur. Axın tək abunəlikli (single-subscription) və ya çoxabunəlikli (broadcast) ola bilər. Hadisələrin işlənməsi listen(), async*, yield vasitəsilə həyata keçirilir.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Dəyəri axına göndərir
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Alınan: $data'),
        onError: (error) => print('Xəta: $error'),
        onDone: () => print('Axın tamamlandı'),
      );
    }
    

Dart-də asinxronluq "hadisələr döngüsü" (event loop) modelinə əsaslanır. Əsas axın kodu ardıcıl şəkildə icra edir, lakin await və ya Future.then ilə qarşılaşdıqda, bu əməliyyat "hadisələr yığını"na (event queue) göndərilir və kod icrasına davam edir. Asinxron əməliyyat tamamlandıqda, onun nəticəsi yenidən "hadisələr yığını"na göndərilir. Hadisələr döngüsü davamlı olaraq "hadisələr yığını"nı yoxlayır və əsas axın boş olduqda tapşırıqları yerinə yetirir.