Dart Async

sync

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

// 1 + 1 = 2
// 2 + 2 = 4
void addNumbers(int num1, int num2) {
  print('계산중 : $num1 + $num2');
  
  print('계산 완료 : ${num1 + num2}');
}

계산중 : 1 + 1 계산 완료 : 2 계산중 : 2 + 2 계산 완료 : 4

async

  • CPU가 기다리는 동안, 쉬지 않고 다른 작업을 할 수 있도록 구성

void main() {
  // Future - 미래
  // 미래에 받아올 값
  Future<String> name = Future.value('soobin');
  Future<int> num = Future.value(1);
  Future<bool> isTrue = Future.value(true);

  print('함수 시작');
  addNumbers(1, 1);
  
  Future.delayed(Duration(seconds: 2), (){
    print('Delay 끝');
  });
}

void addNumbers(int num1, int num2) {
  print('계산 시작 : $num1 + $num2');
  
  Future.delayed(Duration(seconds: 2), (){
    print('게산 완료 : $num1 + $num2 = ${num1 + num2}');
  });
  
  print('함수 완료');
}

함수 시작 계산 시작 : 1 + 1 함수 완료 게산 완료 : 1 + 1 = 2 Delay 끝

void main() {
  // Future - 미래
  // 미래에 받아올 값
  Future<String> name = Future.value('soobin');
  Future<int> num = Future.value(1);
  Future<bool> isTrue = Future.value(true);

  print('함수 시작');
  addNumbers(1, 1);
  addNumbers(2, 2);
  
  Future.delayed(Duration(seconds: 2), (){
    print('Delay 끝');
  });
}

void addNumbers(int num1, int num2) {
  print('계산 시작 : $num1 + $num2');
  
  Future.delayed(Duration(seconds: 2), (){
    print('게산 완료 : $num1 + $num2 = ${num1 + num2}');
  });
  
  print('함수 완료');
}

함수 시작

계산 시작 : 1 + 1

함수 완료

계산 시작 : 2 + 2

함수 완료

게산 완료 : 1 + 1 = 2

게산 완료 : 2 + 2 = 4

Delay 끝

await

void main() {
  // Future - 미래
  // 미래에 받아올 값
  Future<String> name = Future.value('soobin');
  Future<int> num = Future.value(1);
  Future<bool> isTrue = Future.value(true);

  print('함수 시작');
  addNumbers(1, 1);
  addNumbers(2, 2);

  Future.delayed(Duration(seconds: 2), () {
    print('Delay 끝');
  });
}

void addNumbers(int num1, int num2) async {
  print('계산 시작 : $num1 + $num2');

  await Future.delayed(Duration(seconds: 2), () {
    print('게산 완료 : $num1 + $num2 = ${num1 + num2}');
  });

  print('함수 완료');
}

함수 시작 계산 시작 : 1 + 1 계산 시작 : 2 + 2 게산 완료 : 1 + 1 = 2 함수 완료 게산 완료 : 2 + 2 = 4 함수 완료 Delay 끝

main의 async

void main() async {
  // Future - 미래
  // 미래에 받아올 값
  Future<String> name = Future.value('soobin');
  Future<int> num = Future.value(1);
  Future<bool> isTrue = Future.value(true);

  print('함수 시작');
  await addNumbers(1, 1);
  await addNumbers(2, 2);

  Future.delayed(Duration(seconds: 2), () {
    print('Delay 끝');
  });
}

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

  await Future.delayed(Duration(seconds: 2), () {
    print('게산 완료 : $num1 + $num2 = ${num1 + num2}');
  });

  print('함수 완료');
}

함수 시작 계산 시작 : 1 + 1 게산 완료 : 1 + 1 = 2 함수 완료 계산 시작 : 2 + 2 게산 완료 : 2 + 2 = 4 함수 완료

Future를 통한 return 값 받기

void main() async {
  // Future - 미래
  // 미래에 받아올 값
  Future<String> name = Future.value('soobin');
  Future<int> num = Future.value(1);
  Future<bool> isTrue = Future.value(true);

  print('함수 시작');
  final result1 = await addNumbers(1, 1);
  final result2 = await addNumbers(2, 2);

  Future.delayed(Duration(seconds: 2), () {
    print('Delay 끝');
  });
}

Future<int> addNumbers(int num1, int num2) async {
  print('계산 시작 : $num1 + $num2');

  await Future.delayed(Duration(seconds: 2), () {
    print('게산 완료 : $num1 + $num2 = ${num1 + num2}');
  });

  print('함수 완료');
  
  return num1 + num2;
}

stream

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream;
  
  final streamListener1 = stream.listen((val){
    print('Listener 1 : $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
  
}

strem 여러개

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  final streamListener1 = stream.listen((val){
    print('Listener 1 : $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
  
  final streamListener2 = stream.listen((val){
    print('Listener 2 : $val');
  }); 
}

Listener 1 : 1 Listener 2 : 1 Listener 1 : 2 Listener 2 : 2 Listener 1 : 3 Listener 2 : 3 Listener 1 : 4 Listener 2 : 4 Listener 1 : 5 Listener 2 : 5

import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream.asBroadcastStream();
  
  final streamListener1 = stream.where((val) => val % 2 == 0).listen((val){
    print('Listener 1 : $val');
  });
  
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add(3);
  controller.sink.add(4);
  controller.sink.add(5);
  
  final streamListener2 = stream.where((val) => val % 2 == 1).listen((val){
    print('Listener 2 : $val');
  }); 
}

Listener 2 : 1 Listener 1 : 2 Listener 2 : 3 Listener 1 : 4 Listener 2 : 5

stream, async

import 'dart:async';

void main() {
  calculate(1).listen((val){
    print('calculate(1) : $val');
  });
}

Stream<int> calculate(int number) async* {
  for (int i = 0; i < 5; i++) {
    yield i * number;
  }
}

calculate(1) : 0 calculate(1) : 1 calculate(1) : 2 calculate(1) : 3 calculate(1) : 4

import 'dart:async';

void main() {
  calculate(2).listen((val){
    print('calculate(1) : $val');
  });
}

Stream<int> calculate(int number) async* {
  for (int i = 0; i < 5; i++) {
    yield i * number;
  }
}

calculate(1) : 0 calculate(1) : 2 calculate(1) : 4 calculate(1) : 6 calculate(1) : 8

import 'dart:async';

void main() {
  calculate(2).listen((val){
    print('calculate(1) : $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));
  }
}

calculate(1) : 0 calculate(4) : 0 calculate(1) : 2 calculate(4) : 4 calculate(1) : 4 calculate(4) : 8 calculate(1) : 6 calculate(4) : 12 calculate(1) : 8 calculate(4) : 16

import 'dart:async';

void main() {
  playAllStream().listen((val){
    print(val);
  });
}

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;

    await Future.delayed(Duration(seconds: 1));
  }
}

0 1 2 3 4 0 1000 2000 3000 4000

Last updated