03. 다트 비동기 프로그래밍

Future

Future 클래스는 미래에 받아올 값이라는 의미

Future<String> name; // 미래에 받을 String 값
Future<int> number; // 미래에 받을 int 값
Future<bool> isOpened // 미래에 받을 boolean 값
void main() {
  addNumbers(1, 2);
}

void addNumbmers(int number1, int number2) {
  print ('$number1 + $number2 계산 시작');

  //Future.delayed()를 사용하여 일정 시간 이후 콜백 함수 실행
  Future.delayed(Duration(seconds: 3), () {
    print('$number1 + $number2 = ${number1 + number2}');
  });

  print ('$number1 + $number2 코드 실행 끝');
}


/*
* 실행 결과
* 1 + 2 계산 시작
* 1 + 2 코드 실행 끝
* 1 + 2 = 3
*/

async와 await

void main() {
  addNumbers(1, 2);
}

Future<void> addNumbers(int number1, int number2) async{
  print ('$number1 + $number2 계산 시작');

  // await는 대기하고 싶은 비동기 함수 앞에 입력
  await Future.delayed(Duration(seconds: 3), () {
    print('$number1 + $number2 = ${number1 + number2}');
  });

  print ('$number1 + $number2 코드 실행 끝');
} 

/*
* 실행 결과
* 1 + 2 계산 시작
* 1 + 2 = 3
* 1 + 2 코드 실행 끝
*/

Stream

Future는 반환을 딱 한번 받아내는 비동기 프로그래밍

지속적으로 값을 반환 받을 땐 Stream 사용

// 일반 스트림
import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream; // stream 생성

  // listen() 함수 실행 시 값이 주입될 때 마다 콜백 함수 실행
  final streamListener1 = stream.listen((val) {
    print(val);
  });

  // stream에 값 주입
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
}
// 브로드캐스트 스트림 : 하나의 스트림을 생성하고 여러번 listen()함수를 실행하고 싶을 때 사용
import 'dart:async';

void main() {
  final controller = StreamController();

  final stream = controller.stream.asBroadcastStream();

  //첫번째 listen 함수
  final streamListener1 = stream.listen((val) {
    print('listening 1');
    print(val);
  });

  //두번째 listen 함수
  final streamListener2 = stream.listen((val) {
    print('listening 2');
    print(val);
  });

  // stream에 값 주입
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
}
//함수로 스트림 반환
import 'dart:async';

Stream<String> calculate(int number) async* {
  for(int i = 0; i < 5; i++) {
    yield i = $i;
    await Future.delayed(Duration(seconsd : 1));
  }
}

void playStream() {
  calculate(1).listen((val) {
    print(val);
  });
}

void main() {
  playStream();
}

+ Recent posts