일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- datagrip 한글깨짐
- tecoble
- svn
- MySQL
- SQL
- maven
- 봤어요처리
- InteliJ
- TypeScript
- Aspect
- 인텔리제이
- flutter mac 설치
- node.js
- @RequestBody
- Java
- JavaScript
- 코어자바스크립트
- javascript error
- Mac
- DART
- Stream
- 프로젝트 여러 개
- class-transformer
- Spring
- 프로그래머스
- eqauls-hashcode
- db
- REST
- ojdbc6
- oracle
Archives
- Today
- Total
개발자가 되고 싶은 개발자
Dart 비동기 프로그래밍 (Future, async, await, stream) 본문
Future
Future라는 미래에 받을 값들에 대해서 받을 수 있는 생소한 키워드가 존재한다.
자바에서도 비동기 프로그래밍에서 사용하는 키워드이다.
지금까지 본 결과 TypeScript와 Java의 장점이 합쳐진 언어로 보인다.
void main() {
Future<String> name = Future.value('Genesis');
Future<int> serial = Future.value(80);
Future<bool> isMine = Future.value(true);
}
setTimeout과 같은 역할을 아래 문법으로 사용할 수 있다.
Future.delayed(Duration(seconds: 2), () {
print('딜레이 종료');
});
async / await
자바스크립트에서 async 함수가 Promise를 반환하는 것처럼 다트도 Future를 반환한다.
main에서 여러 번 호출하고 싶다면, 아래 sum 함수가 void가 아닌 Future<void>로 수정해야 한다.
void main() {
sum(10, 90);
}
void sum(int a, int b) async {
print('Start');
await Future.delayed(Duration(seconds: 2), () {
print(a + b);
});
print('End');
}
Stream
Dart에서 기본적으로 제공하지 않아 import를 통해서 사용할 수 있음
StreamController를 사용할 수 있음.
자바스크립트와 다르게 별도 as 없이 모듈시스템을 import만 하면 사용할 수 있음.
import 'dart:async';
void main() {
final controller = StreamController();
final stream = controller.stream;
final stramListener1 =stream.listen((val) {
print('L1: $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
// output
L1: 1
L1: 2
L1: 3
L1: 4
L1: 5
Broadcast
하나의 컨트롤러로 여러 개 작업을 브로드 캐스트 할 수 있다
아직 와닿지는 않지만, 나눠져 있는 컴포넌트에서 활용할 수 있을 것으로 보인다
import 'dart:async';
void main() {
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final stramListener1 =stream.listen((val) {
print('L1: $val');
});
final stramListener2 =stream.listen((val) {
print('L2: $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
// output
L1: 1
L2: 1
L1: 2
L2: 2
L1: 3
L2: 3
L1: 4
L2: 4
L1: 5
L2: 5
Litener별로 출력값 조정
import 'dart:async';
void main() {
final controller = StreamController();
final stream = controller.stream.asBroadcastStream();
final stramListener1 =stream.where((val) => val % 2 == 0).listen((val) {
print('L1: $val');
});
final stramListener2 =stream.where((val) => val % 2 == 1).listen((val) {
print('L2: $val');
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}
// output
L2: 1
L1: 2
L2: 3
L1: 4
L2: 5
Stream 함수로 사용
import 'dart:async';
void main() {
calculate(2).listen((val) {
print(val);
});
}
Stream<int> calculate(int num) async* {
for(int i = 1; i <= 5; i++) {
yield i * num;
}
}
이전 포스팅 참고
기본 문법
클래스와 인터페이스
'Dev > Flutter' 카테고리의 다른 글
Flutter 설치 (mac) (0) | 2024.04.03 |
---|---|
Dart 클래스와 인터페이스 (0) | 2024.03.31 |
Dart 기본 문법 빠르게 정리 (0) | 2024.03.30 |