async와 async*는 둘 다 Dart 프로그래밍에서 비동기 코드를 작성하는 데 사용되는 키워드이다.
단, 두 키워드의 차이점은 값을 Stream 으로 돌려주냐
Future 로 돌려주냐의 차이이다.
async
async 함수는 비동기 작업을 수행하는 함수를 선언할 때 사용됩니다.
Future 를 사용했을 때 상태값은 3가지가 있다.
1. 전달을 못받은 미완료된 데이터
2. 전달받은 완료된 데이터
3. 전달받은 완료된 데이터이지만 에러인 데이터
async 함수는 위의 세가지 Future 상태를 비동기적으로 반환합니다.
async 함수가 호출되면 해당 함수가 비동기 작업을 시작하고, 작업이 완료되면 결과를 반환합니다.
예제 1 :
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
결과값 : 1초뒤에 42 반환
예제 2:
void main() {
Future<int>.delayed(
Duration(seconds: 3), (){
throw Exception();
},
).then((value) {
print(value);
}).catchError(
(err) {
print('Caught $err');
},
test: (err) => err.runtimeType == String,
).whenComplete(() {
print('All finished!');
});
print('waiting...');
}
결과값 :
1 .then 에서 결과값을 기다린다.
2. catchError 에서 에러값을 잡아낸다.
3. 모든 비동기작업이 완료되면 whenComplete 함수 아래가 호출된다.
async*
async* 함수는 제너레이터(generator) 함수로, 비동기적으로 데이터를 생성하는 데 사용됩니다.
async* 함수는 스트림(Stream)이나 이터러블(Iterable) 데이터 타입을 생성하고, 데이터를 비동기적으로 생성하면서 호출자에게 반환합니다.
async* 함수가 호출되면 호출자는 yield 문을 만날 때마다 값을 받아와서 처리하며, 함수는 일시 중단하지 않습니다.
예제 3 :
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
결과값 : 1초당 해당 i 값이 반환
요약하면, async는 비동기 함수의 선언에 사용되고, async*는 데이터를 비동기적으로 생성하는 제너레이터 함수에 사용됩니다. 각각의 키워드는 다른 비동기 패턴을 지원하고 다른 용도로 사용됩니다.
요약
참고 유투브 :
https://www.youtube.com/watch?v=OTS-ap9_aXc&list=PLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2&index=17
https://www.youtube.com/watch?v=nQBpOIHE4eE&list=PLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2&index=16
'Flutter' 카테고리의 다른 글
[Flutter] AndroidManifest.xml 에서 attribute not allowed here” error (0) | 2023.10.11 |
---|---|
[Flutter] 공부 - 9 안드로이드 폰 윈도우 환경 PC 에서 미러링하기 (0) | 2023.09.27 |
[Flutter] 공부 5 - Android Studio 로 개발환경설정 및 firebase 연동 (0) | 2023.09.15 |
[Flutter] 공부 2 ( 단축키 ) (0) | 2023.08.30 |
[Flutter] 공부시작 1 ( 설치 및 세팅 ) (0) | 2023.07.20 |