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초 후 실행
그 다음 실행
그 다음 다음 실행
Finish4. 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: 에러 발생
FinishRelated Posts
- Flutter/Dart - Future.delayed() 사용 방법
- Flutter/Dart - Stream 사용 방법
- Flutter/Dart - 파일, 디렉토리 삭제
- Flutter/Dart - 텍스트 파일 쓰기
- Flutter/Dart - 반복문 (for, while, for-in, forEach)
- Flutter/Dart - Static 변수, 메소드 선언
- Flutter/Dart - 텍스트 파일 읽기
- Flutter/Dart - 다양한 Null 체크 방법
- Flutter/Dart - Double을 Int로 변환
- Flutter/Dart - Double을 String으로 변환
- Flutter/Dart - String을 Double로 변환
- Flutter/Dart - String을 List로 변환
- Flutter/Dart - String에서 특정 문자열 Index 찾기
- Flutter/Dart - String 길이(length)
- Flutter/Dart - 몇 초 지연시키기, sleep
- Flutter/Dart - 날짜 계산, 년/월/일 더하고 빼기
- Flutter/Dart - 날짜 문자열을 DateTime으로 변환
- Flutter/Dart - 현재 시간 가져오기, DateTime
- Flutter/Dart - Map에 key-value 추가
- Flutter/Dart - Map 선언 및 초기화
- Flutter/Dart - Map 순회 방법
- Flutter/Dart - Map에서 Entry(key-value) 제거
- Flutter/Dart - key, value로 Map 정렬
- Flutter/Dart - 리스트 복사 방법
- Flutter/Dart - 리스트 합치는 방법
- Flutter/Dart - 리스트 최대값, 최소값 찾기
- Flutter/Dart - 리스트 요소 추가, 특정 위치 추가
- Flutter/Dart - 리스트 요소 제거
- Flutter/Dart - 리스트 요소 값 변경, 찾기
- Flutter/Dart - 리스트 합계, 평균 계산
- Flutter/Dart - 리스트 중복 제거
- Flutter/Dart - 리스트 정렬 (오름차순, 내림차순)
- Flutter/Dart - 리스트 자르기, 분리하기
- Flutter/Dart - 변수 타입 체크
- Flutter/Dart - 리스트 필터링