Flutter/Dart - Future.delayed() 사용 방법

Dart에서 Future.delayed()를 이용하여 비동기(Asynchronous) 프로그래밍을 할 수 있습니다.

비동기 프로그래밍은 동시에 여러 작업을 수행하는 코드를 작성하는 것입니다. Future.delayed()를 사용하면 명시적으로 쓰레드를 만들지 않아도 비동기적으로 어떤 작업을 수행시킬 수 있습니다.

1. Future.delayed()의 비동기 함수 호출

아래와 같이 Future.delayed(Duration, function)을 호출하면 설정한 Duration 시간 뒤에, function이 비동기적으로 실행됩니다.

  • 결과를 보면 main()의 코드가 모두 수행되고, Future.delayed()의 코드는 현재 쓰레드에 영향을 주지 않고(다른 쓰레드에서 동작하는 것처럼) 2초 뒤에 실행됨
void main() {

  print("Start");   
  Future.delayed(Duration(seconds:2),() => print('2초 후 실행'));
  print("Finish");
}

Output:

Start
Finish
2초 후 실행

위에서 람다 표현식으로 만든 함수는, 아래와 같이 { }를 사용하여 여러 줄로 구현할 수도 있습니다.

void main() {

  print("Start");   
  Future.delayed(Duration(seconds:2),() {
    print('2초 후 실행');
    print('비동기로 실행 중');
  });
  print("Finish");
}

Output:

Start
Finish
2초 후 실행
비동기로 실행 중

2. async와 await

메인 쓰레드에서 Future.delayed()의 함수가 모두 끝나기를 기다리려면 어떻게 해야할까요?

await 키워드는 함수가 종료될 때까지 기다리며, await Future.delayed()처럼 사용할 수 있습니다.

  • await은 async 함수 안에서만 사용할 수 있음
  • main() 함수 옆에 async 키워드를 붙이면 async 함수가 됨
void main() async {

  print("Start");
  await Future.delayed(Duration(seconds:2),() => print('2초 후 실행'));
  print("Finish");
}

Output:

Start
2초 후 실행
Finish

다른 함수를 async로 만들기

아래 예제는 다른 함수를 async로 만들고, await을 사용하여 비동기 함수가 끝날때 까지 기다립니다.

  • main()은 async가 아니기 때문에 await에 영향을 받지 않음
  • func() 안에서 Future.delayed() 함수가 모두 완료된 뒤에 func()가 완료됨
Future func() async {
  print("Start func()");
  await Future.delayed(Duration(seconds:2),() => print('2초 후 실행'));
  print("Finish func()");
}

void main() {

  print("Start");
  func();
  print("Finish");
}

Output:

Start
Start func()
Finish
2초 후 실행
Finish func()

3. then(), then()...

Future.delayed()는 함수 수행 후, 다음에 실행할 함수를 설정하는 chainning 기능도 제공합니다.

then(function)에 인자로 전달된 함수는 Future.delayed()의 함수가 실행된 뒤에 실행됩니다. 또한, then()을 여러번 사용하여 여러 함수를 순차적으로 실행시킬 수 있습니다.

void main() async {

  print("Start");
  await Future.delayed(Duration(seconds:2),() => print('2초 후 실행'))
      .then((_) => print('그 다음 실행'))
      .then((_) => print('그 다음 다음 실행'));
  print("Finish");
}

Output:

Start
2초 후 실행
그 다음 실행
그 다음 다음 실행
Finish

4. catchError()

catchError()는 Future.delayed()에서 에러가 발생했을 때 예외를 처리하는 구문입니다.

아래와 같이 예외를 처리할 수 있습니다.


void main() async {

  print("Start");

  await Future.delayed(Duration(seconds:2),() => print('2초 후 실행'))
      .then((_) => throw Exception('then에서 에러 발생'))
      .catchError((error) => print('에러: ($error)'));

  print("Finish");
}

Output:

Start
2초 후 실행
에러: (Exception: then에서 에러 발생)

try-catch로 예외 처리

try-catch 구문을 사용하여 아래 처럼 예외를 처리할 수 있습니다.


void main() async {

  print("Start");

  try {
    await Future.delayed(Duration(seconds:2),() => print('2초 후 실행'));
    throw Exception('에러 발생');
  } catch (error) {
    print('에러: $error');
  }

  print("Finish");
}

Output:

Start
2초 후 실행
에러: Exception: 에러 발생
Finish
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha