티스토리 뷰

Dart 도 DB 작업이나 IO 작업 등을 위한 비동기 프로그래밍을 지원한다.

 

Dart의 비동기 프로그래밍은 Future 클래스와 async, await 키워드를 사용한다.

 

바로 한번 확인해보자.


1. Future

 

 Future는 비동기 작업의 결과를 2개의 상태로 표현한다. 상태에는 completed 와 uncompleted 가 존재한다.

 

 - uncompleted(미완성): 비동기 함수를 호출하면, 미완성 Future를 리턴한다. Future는 함수의 비동기 작업이 끝나거나 에러를 던지는 것을 기다린다.

 

 - completed(완성): 비동기 작업이 성공하면, Future는 값을 완성하게 된다. 작업이 실패하면 에러를 완성한다.

 

 1) 값으로 완성 

void main(List<String> arguments) {
  getUserOrder();
  print("Fetching user order");
}

Future<void> getUserOrder() {
  return Future.delayed(
    Duration(seconds: 3),
      () => print("Ice americano")
  );
}

>> 

Fetching user order
Ice americano

 

 2) 에러로 완성

void main(List<String> arguments) {
  getUserOrder();
  print("Fetching user order");
}

Future<void> getUserOrder() {
  return Future.delayed(
    Duration(seconds: 3),
      () => throw Exception("Error!")
  );
}

>>

Fetching user order
Unhandled exception:
Exception: Error!


2. async & await

 

async & await는 함수를 정의하고 그 결과를 사용하기 위한 선언적인 방법을 제공한다.

 - async 함수를 정의하려면 함수 몸체 전에 async를 추가한다.

 - await 키워드는 async 함수에서만 사용할 수 있다.

 

async 함수에서는 await 키워드를 사용하여 Future가 완성되는 것을 기다릴 수 있다.

void main(List<String> arguments) async {
  print("Fetching user order");
  print(await createOrderMessage());
}

Future<String> getUserOrder() {
  return Future.delayed(
    Duration(seconds: 3),
      () => "Ice americano"
  );
}

Future<String> createOrderMessage() async {
  var order = await getUserOrder();
  return 'Your order is : $order';
}

>> 

Fetching user order
Your order is : Ice americano

 

위 코드를 보면, async 키워드를 통해서 createOrderMessage, main 함수가 비동기 함수가 되었다.

 

비동기문의 완성된 결과를 받기 위해서는 await 키워드가 getUserOrder, createOrderMessage에 사용되었다. 즉, Future를 반환하는 함수들을 호출할 때는 await 키워드를 붙인다는 것!

'Mobile > Dart' 카테고리의 다른 글

[Dart] Null Safety  (0) 2022.06.27
[Dart] factory  (0) 2022.06.26
[Dart] Extends, Implements, With  (0) 2022.06.26
[Dart] Dart 기본  (0) 2022.06.26
Comments