본문 바로가기

Dart

[Dart] Future, async-await

간단한 Future 사용법 정리.

 

import 'dart:async';

void printDailyNewsDigest()  { // Future 가 완료되기 이전에 인스턴스만 반환
	var newsDigest =  gatherNewsReports(); 
	print(newsDigest);
}

void main() {
  print('======= Start =======');
	printDailyNewsDigest();
	// 아래 함수들은 모두 기다리게 하려고 의도함, 하지만 실패
	printWinningLotteryNumbers();
	printWeatherForecast();
	printBaseballScore();
}

void printWinningLotteryNumbers() {
  print('printWinningLotteryNumbers()');
}

void printWeatherForecast() {
  print('printWeatherForecast()');
}

void printBaseballScore() {
  print('printBaseballScore()');
}

const news = '<gatherd neews goes here>';
const oneSecond = Duration(seconds: 2);

Future<String> gatherNewsReports() =>
  Future.delayed(oneSecond, () => news);

 

의도하지 않은 출력결과 - printDailyNewsDigest 가 완료되기전에 반환되기 때문에 리턴 타입만 출력된다.

 

Instance of '_Future<String>' ==> printDailyNewsDigest() 함수가 완료되기 전에 반환됨.
printWinningLotteryNumbers()
printWeatherForecast()
printBaseballScore()

 

-  async, await 옵션 추가

 

import 'dart:async';

// async, await 옵션 추가
void printDailyNewsDigest() async {
	var newsDigest = await gatherNewsReports(); // take time
	print(newsDigest);
}

 

<의도한 출력결과>

 

======= Start =======
printWinningLotteryNumbers()
printWeatherForecast()
printBaseballScore()
<gatherd neews goes here> ==> 2초 후, 결과가 정상적으로 출력됨

 

-  async, await 대신에 then 사용하는 경우

 

import 'dart:async';

void printDailyNewsDigest() {
  var newsDigest = gatherNewsReports();
  newsDigest.then((value) => {
  // 단점은 value 에 대한 접근을 then 내부에서만 가능함.
    print(value)
  });
}

 

오류 발생할 경우를 대비해서 try-catch 구문 추가

 

import 'dart:async';

void printDailyNewsDigest() async {
  try{
	var newsDigest = await gatherNewsReports();
    print(newsDigest);
  }catch(e){
    print(e.toString());
  }
}

--------------------

import 'dart:async';

void printDailyNewsDigest() {
  var newsDigest = gatherNewsReports();
  newsDigest.then((value) => {
    print(value)
  });
  
  newsDigest.catchError((e) => {
    print(e)
  });
}

 

'Dart' 카테고리의 다른 글

[Dart] Class - getter, setter  (0) 2021.05.27
[Dart] Class - 선언 및 생성자  (0) 2021.05.27
[Dart] Null Safety  (0) 2021.05.12
[Dart] Stream 처리.  (0) 2021.05.01
[Dart] 상속과 변수 초기화  (0) 2021.04.30