비동기 지원
- 다트 라이브러리엔 Future 혹은 Stream 을 반환하는 함수들이 많다
- 비동기 함수들은 보통 I/O 혹은 네트워크 작업과 같은 시간 집약적 작업들을 수행을 걸어놓고 작업이 완료될 때까지 기다리지 않고 바로 리턴을 수행한다.
async
,await
키워드는 마치 동기작업을 하는 것처럼 코드를 보기 편하게 해준다.
Future
다루기
- 라이브러리 투어 에 나오는 것처럼
.then()
혹은await
을 이용해 future 를 다룰 수 있다. - 단
await
을 이용하려면 무조건async
바디 내부여야 한다. async
함수는await
을 만나기 전까지는 동기처럼 수행된다.async
함수의 바디 내에는await
이 몇개 들어있든 상관 없다.Future
는 오브젝트를 반환하겠다는 약속(promise) 이다.- 실수로
await
하지 않고, 그냥async
에서Future
를 반환하는 것은 보통 의도치 않게 일어난다.- Unwanted futures linter 규칙 을 통해 방지할 수 있다.
비동기 함수로 바꾸기
- 반환 타입을
Future
로 바꾸고async
를 함수 바디 전에 적어주면 된다.
String lookUpVersion() => '1.0.0';
Future<String> lookUpVersion() async => '1.0.0';
스트림 다루기
스트림을 다룰 땐 아래 두가지 옵션이 있다.
async
와await for
루프를 이용하는 방법- Stream API 를 이용하는 방법
일반적으로 UI 이벤트 리스너에는
await for
를 사용하면 안 된다. 끝없는 이벤트 스트림이 들어올 확률이 높기 때문에 버벅이거나 장애가 발생할 확률이 클 것.
UI 와 관련 없는 연속된 비동기 로직 처리에만 이용될 것이다.
await for
에서in
뒤에 들어가는 타입은Stream
이다.- 아래의 예는 짝수가 나오는 경우 2배를 곱하고 아니면 스킵하는 코드이다.
Stream
이 닫힐 때까지 스트림 값을 기다리고, 값이 나오면(emits the value)await for
의 바디를 실행한다.- 중간에
break
혹은return
을 이용하여 구독을 취소할 수도 있다. - 비동기 for 루프를 구현하다 컴파일 오류가 난다면,
await for
가async
함수 내에 있는지 확인해보면 된다.
import 'dart:async';
import 'dart:math';
// Asynchronously generates random integers and adds them to a StreamController.
Stream<int> getRandomNumbers() async* {
final Random random = Random();
for (int i = 0; i < 10; i++) {
await Future.delayed(Duration(seconds: 1)); // Simulate some delay
yield random.nextInt(100); // Yields a random integer
}
}
Future<void> main() async {
final Stream<int> stream = getRandomNumbers();
// Use 'await for' to asynchronously process each integer from the stream.
await for (final int n in stream) {
if (n.isEven) {
print('Received an even integer: $n, doubling it: ${n * 2}');
} else {
print('Received an odd integer: $n, skipping.');
}
}
}
반응형
'Dart' 카테고리의 다른 글
Dart 에서 import hide 이용하기 (0) | 2023.12.15 |
---|---|
Dart 의 Null-safe 언어적 특성 (0) | 2023.12.15 |
다트 비동기 프로그래밍 (Future, Async, Await) (0) | 2023.10.22 |
다트 (Dart) 언어의 생성자 (Constructors) 정리 (0) | 2023.10.13 |
다트(Dart) 언어의 클래스(Class) 정리 (0) | 2023.10.12 |