




서버에 요청하고 결과값을 받아올 때는 무조건 아래 '서버 시뮬레이션'처럼 시간이 걸림
따라서 함수를 순차적으로 짜면 안되고, 지연되는 시간을 고려해서 로직을 짜면 코드가 복잡해짐
이를 해결하기 위한 것이 await임
await 키워드인 'async'는 함수파라미터()와 함수바디{} 사이에 적으면 됨
await는 관련 async 함수 앞에 씀
await 다음에 실행될 함수들은 잠시 대기하지만,
다른 코드를 실행할 수 있는 여지가 있으면 cpu처리가 진행됨.

모든 함수에 Future 사용 가능





// Stream은 패키지를 불러와야 사용할 수 있음
import 'dart:async';
void main() async {
// dart:async패키지에서 StreamController 클래스를 불러옴
final controller = StreamController();
final stream = controller.stream;
// stream에 있는 listen()함수를 불러옴
// listen()에는 함수를 파라미터로 받으며, 해당 함수파라미터에도 한 개의 파라미터를 입력함
final streamLister1 = stream.listen((val) {
print('Listener 1: $val');
});
// .add()함수를 통해 controller에 값을 넣어주면, Listener에 값이 들어감
// stream은 여러 개의 값을 돌려줄 수 있음
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.add(4);
controller.sink.add(5);
}


import 'dart:async';
void main() {
calculate(2).listen((val){
print('calculate(2): $val');
});
calculate(4).listen((val){
print('calculate(4): $val');
});
}
Stream<int> calculate(int number) async*{
for(int i = 0; i < 5; i++){
yield i * number;
await Future.delayed(Duration(seconds:1));
}
}


import 'dart:async';
void main() {
// // async로 동시에 두 함수가 동시에 실행됨
// calculate(2).listen((val){
// print('calculate(2): $val');
// });
// calculate(4).listen((val){
// print('calculate(4): $val');
// });
playAllStream().listen((val){
print(val);
});
}
// yield*을 쓰면 앞 함수가 다 실행되어야 다음 함수가 실행됨
Stream<int> playAllStream() async*{
yield* calculate(1);
yield* calculate(1000);
}
Stream<int> calculate(int number) async*{
for(int i = 0; i < 5; i++){
yield i * number;
// 1초 뒤 다음 loop 실행
await Future.delayed(Duration(seconds:1));
}
}