@44 Future (Asynchronous Programming in Dart) သင်ခန်းစာ

Dart Programming Language မှာ asynchronous Model တွေဖြစ်တဲ့ Isolate, Event Loop အကြောင်းကိုလေ့လာပြီးဆိုတော့ very basic ကျတဲ့ Api ဖြစ်တဲ့ “Future” အကြောင်းကိုလေ့လာသွားမယ်။

Youtube Channel

Future,async and await အဲ့ဒီ api တွေကတော့ Android Kotlin coroutine, javascript က Promise တို့ ကိုလေ့လာဖူးသူတွေ ဆိုရင် နားလည်ရလွယ်ကူမှာဖြစ်ပါတယ်။ ကျတော်တို့ heavy process တွေကို Future ကို သုံးပြီး asynchronous လုပ်သွားမှာဖြစ်ပါတယ်။ asyncs/await ကတော့ callback hell တွေကို ဖြေရှင်းပေးနိုင်တာဖြစ်ပြီး နောက်သင်ခန်းစာမှ လေ့လာသွားမှာဖြစ်ပါတယ်။

Future ကတော့ Event Loop ထဲက Event Queue မှာ အလုပ်လုပ်တာဖြစ်ပါတယ်။

Flutter Framework မှာ network request, Database input/output, နဲ့ ၁ ခြား long running process တွေ run တဲ့နေရာမှာ Future သုံးရမှာဖြစ်တဲ့အတွက် အရေးကြီးတဲ့ Api ၁ ခုဖြစ်ပါတယ်။ Flutter ရဲ့ အားသာချက်ကတော့ Network request တို့ Database read/write လုပ်တာတို့အတွက် ဘယ် Thread မှာသွား run ပါဆိုပြီးတော့ developer က handle လုပ်ပေးစရာ မလိုပဲ Framework က manage လုပ်ပေးသွားတာပဲဖြစ်ပါတယ်။ ဒါပေမယ့် ပုံမှန် Future function တစ်ခုရေးရုံနဲ့ Sperate Thread မှာ သွား run တာတော့မဟုတ်ပါဘူး။

void main(){
  print('one');
  print('two');
  Future(()=> print('Long running Operation'));
  print('three');
  print('four');
}

အပေါ်က code ကို run လိုက်မယ်ဆိုရင် အောက်ပါအတိုင်းရရှိမှာဖြစ်ပါတယ်။

one
two
three
four
Long running Operation

Future ရဲ့  Anonymous function ထဲမှာရေးထားတဲ့ Long running operation ကို Program က ကျော်သွားပြီး three, four ကို print လုပ်သွားတယ်။ အားလုံးပြီးမှ Future က အလုပ်လုပ်မှာဖြစ်ပါတယ်။

void main() {
  print('one');
  getString().then((str){
    print(str);
  });
  print('two');
}
Future<String> getString() {
  return Future.delayed(
      Duration(seconds: 2), () => "This is Stirng from Future");
}

အပေါ်က code ကို run လိုက်မယ်ဆိုရင် အောက်ပါအတိုင်းရရှိမှာဖြစ်ပါတယ်။

one
two
This is Stirng from Future

getString( ) ဆိုတဲ့ function က Future နဲ့ရေးထားတဲ့အတွက် asynchronous function တစ်ခုဖြစ်ပြီး String value ၁ခု return ပြန်ပေးမှာဖြစ်ပါတယ်။ Future.delayed ဆိုတဲ့ function ကတော့ argument ၂ ခုထည့်ပေးရမှာဖြစ်ပြီးတော့ ပထမ ၁ ခုကတော့ Duration ပါ။ အခု eg: မှာတော့ 2 second delay ကြာအောင် program က ရပ်နေမှာ ဖြစ်ပါတယ်။ ဒုတိယ argument မှာတော့ anonymous function ၁ ခု String value  နဲ့ return ပြန်ပေးထားပါတယ်။ ဒီ function ကို call လိုက်မယ်ဆိုရင်တော့ Duration က 2 second ကြာအောင်ရပ်နေမှာဖြစ်ပြီးတော့ “This is Stirng from Future” ဆိုတဲ့စာသားလေး return ပြန်ပေးသွားမှာဖြစ်ပါတယ်။

Future function ၁ ခုကို ခေါ်သုံးချင်ရင်တော့ function name  ရဲ့နောက်မှာ then ဆိုတဲ့ function 1 ခု run ပေးရမှာဖြစ်ပါတယ်။ then ဆိုတဲ့ function ထဲမှာ parameter ၁ ခုနဲ့ အတူ anonymous function 1 ခုပါလာမှာဖြစ်ပါတယ်။

getString().then((str){
    print(str);
  });

OK အဲ့ဒီ function က ပါလာတဲ့ str ဆိုတဲ့ value ကတော့ ဟိုဖက်က getString( ) က return ပြန်လိုက်တဲ့ String value ပဲဖြစ်ပါတယ်။ one , two ကို  print ထုတ်ပြီး 2 seconds ကြာမှ This is Stirng from Future ဆိုတဲ့စာသားကိုထုတ်ပြမှာဖြစ်ပါတယ်။

one
two
2 second ကြာပြီးမှ
This is Stirng from Future

ဒီ example မှာတော့ future function ကနေ value ၁ ခု return ပြန်လာတာပဲဖြစ်ပါတယ်။ တကယ့် app မှာဆိုရင် value ပဲ မဟုတ်ပဲ error ၁ ခုလဲ return  ပြန်လာနိုင်ပါတယ်။

Future function ၁ ခု ကို ခေါ်လိုက်ရင် success value သို့မဟုတ် error ၁ ခု return ပြန်လာမှာဖြစ်ပါတယ်။

ဥပမာ network api ၁ခု ကို request လုပ်လိုက်ရင် success ဖြစ်နိုင်သလို error လဲဖြစ်နိုင်ပါတယ်။ အဲ့အတွက် app မှာ success ဖြစ်ရင် data ပြဖို့လိုပြီး error ဖြစ်ရင်လဲ ဘာကြောင့် error ဖြစ်တယ်ဆိုတာ ပြဖို့လိုပါတယ်။

void main() {
  print('one');
  getString().then((str) {
    print(str);
  }).catchError((e) {
    print(e);
  });
  print('two');
}
Future<String> getString() {
  return Future.delayed(Duration(seconds: 2), () => throw 'This is error');
}

code ကို run လိုက်မယ်ဆိုရင် အောက်ပါအတိုင်းရရှိမှာဖြစ်ပါတယ်။

one
two
This is error

တကယ့် app တွေမှာ network error, server error တွေဖြစ်နိုင်ပေမယ့် အခု ကတော့ plain Dart Program ၁ ခုဖြစ်နေတော့ ကိုယ့်ဟာကိုယ်ပဲ error လုပ်ယူရမှာဖြစ်ပါတယ်။ 😀

() => throw ‘This is error’

throw လို့ရေးထားတဲ့အတွက် error value return ပြန်ပေးသွားမှာဖြစ်ပါတယ်။
ဒီဖက်က error ပေးလိုက်ပြီဆိုတော့ ဟိုဖက်ကလဲ error ကိုစောင့်ဖမ်းပြီး ဘာ error လဲဆိုတာ ထုတ်ကြည့်ရမှာ ဖြစ်ပါတယ်။ error value ကိုတော့ catchError( ) ဆိုတဲ့ function ကနေ ခေါ်ကြည့်ရမှာဖြစ်ပါတယ်။

catchError((e) {
    print(e);
  });

catchError Function မှာ anonymous function ၁ ခုနဲ့အတူ value 1 ခု ပါလာမှာဖြစ်ပါတယ်။ အဲ့ဒီ value ကတော့ ဟိုဖက်ကပို့လိုက်တဲ့  error value ပဲဖြစ်ပါတယ်။ Delay ခံထားတဲ့အတွက် 2 second ကြာပြီးတဲ့ အချိန်မှာ error value ၁ ခု ရောက်လာမှာဖြစ်ပါတယ်။

Future<String> ဆိုတဲ့နေရာမှာ String မဟုတ်ပဲ ၁ ခြား မိမိသုံးချင်တဲ့ class  ပြောင်းသုံးသွားရမှာဖြစ်ပြီးတော့ သဘောတရားကတော့ အတူတူပဲဖြစ်ပါတယ်။

anonymous function တို့ higher order function တို့ကိုမသိသေးဘူးဆိုရင်တော့ အရင်တင်ပေးပြီးသား video File တွေကို အောက်ကလင့်ခ်မှာသွားလေ့လာလို့ရပါတယ်။

Ruby Wai Phyo Aung
  • Ruby Wai Phyo Aung
  • I am professional android developer since 2015