모바일 개발하는 자바리안의 메모장

Flutter(dart) - 비동기 프로그래밍 (Future) 본문

Flutter

Flutter(dart) - 비동기 프로그래밍 (Future)

자바리안 2022. 4. 1. 22:48
반응형

Flutter 의 비동기 로직 처리에 사용되는 대표 키워드 Future, await, async에 간략하게 정리해보려한다.

 

아래 코드는 dart.dev 에서 비동기 처리의 잘못된 예를 보여주기 위해 제공해 준 코드다 :

String createOrderMessage() {
  var order = fetchUserOrder();
  return 'Your order is: $order';
}

Future<String> fetchUserOrder() =>
    Future.delayed(
      const Duration(seconds: 2),
      () => 'Large Latte',
    );

void main() {
  print(createOrderMessage());
}

우선 비동기 처리를 선언하는 Future 키워드를 살펴보자. 있다가 다 처리된 후 알려드릴게요~ 와 같은 느낌으로 키워드를 Future로 선택한 게  아닐까 조심스럽게 추측해본다..

그럼 다시 위 코드로 돌아와 어떤 문제가 있는지 다시 한 번 살펴보자. 위 코드의 결과값은 무엇일까? 코드를 봤을 때 상기 코드는 고객님이 커다란 라떼를 주문했단 걸 보여주려 하는 것 같지만 실제 결과값은 다음과 같다 :

 

 

왜 이런 결과가 나온지 댓글로 가장 먼저 정답을 맞추는 분께는 소정의 선물을 드릴 예정이며, 힌트는 'Thread'다.

 

Future에 대해 좀 더 자세히 알아보자.

Dart 팀이 정리해 둔 내용을 보면 future는 비동기 처리의 결과를 나타내며, uncompleted, completed 두 가지 상태를 갖는다 한다.

우선, uncompleted 상태는 Future가 호출되었을 때 future 인스턴스가 바로 반환이 되는데, 해당 인스턴스는 비동기 작업이 끝날때까지 기다리는 상태로 이 때 상태를 uncompleted 상태라고 한다.

그럼 completed 상태는 당연히 비동기 요청이 끝났을 때 상태인데, 별 탈 없이 모든 처리를 마치고 타입(Future<String> 의 경우 String값을 반환)에 맞는 값을 반환하거나 어떤 이유로 실패하여 에러가 발생했을 때의 상태를 의미한다.

 

Future 객체의 비동기 처리 결과의 성공, 실패에 대한 콜백은 아래와 같이 then, catchError 함수를 사용해주면 된다 : 

fetchUserOrder()
  .then((value) {
    // 정상적으로 타입에 맞는 결과값을 받았을 경우
  })
  .catchError({
  	// 처리 과정에서 에러 발생했을 경우
  });

 

반응형
Comments