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
Related 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 - 리스트 필터링