1.  비동기로 실행되나 로직이 순차적으로 진행 되지 않는다.

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

void addNumber(int number1, int number2)
{
    print("1. 계산 시작 : $number1 + $number2");
    
    Future.delayed(Duration(seconds:2), ()
    {
        print("2. 계산 진행 : $number1 + $number2");
    });
    
    print("3. 계산 종료 : $number1 + $number2 = ${number1 + number2}");
}


1. 계산 시작 : 1 + 1
3. 계산 종료 : 1 + 1 = 2
1. 계산 시작 : 2 + 2
3. 계산 종료 : 2 + 2 = 4
2. 계산 진행 : 1 + 1
2. 계산 진행 : 2 + 2

 

2.  await 키워드 이후 로직은 실행되지 않고 await 로직이 완료될때 까지 대기한다. 대기하는 동안 다른 thread가 진행된다.

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

void addNumber(int number1, int number2) async
{
    print("1. 계산 시작 : $number1 + $number2");
    
    await Future.delayed(Duration(seconds:2), ()
    {
        print("2. 계산 진행 : $number1 + $number2");
    });
    
    print("3. 계산 종료 : $number1 + $number2 = ${number1 + number2}");
}


1. 계산 시작 : 1 + 1
1. 계산 시작 : 2 + 2
2. 계산 진행 : 1 + 1
3. 계산 종료 : 1 + 1 = 2
2. 계산 진행 : 2 + 2
3. 계산 종료 : 2 + 2 = 4

 

3.  main 함수에서 addNumber호출 조차 순차적으로하고 싶다면, main함수에 async, await하면 된다.

단 await 키워드는 Future객체가 return되는 함수에만 사용할 수 있으므로 addNumber함수의 return을 void에서 Future<void>로 변경한다.

void main() async
{
    await addNumber(1, 1);
    print("실행되나?");
    await addNumber(2, 2);
}

Future<void> addNumber(int number1, int number2) async
{
    print("1. 계산 시작 : $number1 + $number2");
    
    await Future.delayed(Duration(seconds:2), ()
    {
        print("2. 계산 진행 : $number1 + $number2");
    });
    
    print("3. 계산 종료 : $number1 + $number2 = ${number1 + number2}");
}


1. 계산 시작 : 1 + 1
2. 계산 진행 : 1 + 1
3. 계산 종료 : 1 + 1 = 2
실행되나?
1. 계산 시작 : 2 + 2
2. 계산 진행 : 2 + 2
3. 계산 종료 : 2 + 2 = 4

 

4.  비동기 함수의 return값 받기.

void main() async
{
    final result1 = await addNumber(1, 1);    // same : final int result1 = await addNumber(1, 1);
    print(result1.runtimeType);
    
    print("\n");
  
    final result2 = await addNumber(2, 2);    // same : final int result2 = await addNumber(1, 1);
    print(result2.runtimeType);
  
    print("\n");
  
    print("result1 : $result1");
    print("result2 : $result2");
    print("결과 : $result1 + $result2 = ${result1 + result2}");
}

Future<int> addNumber(int number1, int number2) async
{
    print("1. 계산 시작 : $number1 + $number2");
    
    await Future.delayed(Duration(seconds:2), ()
    {
        print("2. 계산 진행 : $number1 + $number2");
    });
    
    print("3. 계산 종료 : $number1 + $number2 = ${number1 + number2}");
  
    return number1 + number2;
}

1. 계산 시작 : 1 + 1
2. 계산 진행 : 1 + 1
3. 계산 종료 : 1 + 1 = 2
int


1. 계산 시작 : 2 + 2
2. 계산 진행 : 2 + 2
3. 계산 종료 : 2 + 2 = 4
int


result1 : 2
result2 : 4
결과 : 2 + 4 = 6

 

5.  then함수를 이용한 비동기 함수의 return값 받기 

void main() async
{
    await addNumber(1, 1).then((value)
    {
        print(value.runtimeType);
        print("result1 : $value");
    });

    print("\n");
  
    await addNumber(2, 2).then((value)
    {
        print(value.runtimeType);
        print("result2 : $value");
    });
}

Future<int> addNumber(int number1, int number2) async
{
    print("1. 계산 시작 : $number1 + $number2");
    
    await Future.delayed(Duration(seconds:2), ()
    {
        print("2. 계산 진행 : $number1 + $number2");
    });
    
    print("3. 계산 종료 : $number1 + $number2 = ${number1 + number2}");
  
    return number1 + number2;
}


1. 계산 시작 : 1 + 1
2. 계산 진행 : 1 + 1
3. 계산 종료 : 1 + 1 = 2
int
result1 : 2


1. 계산 시작 : 2 + 2
2. 계산 진행 : 2 + 2
3. 계산 종료 : 2 + 2 = 4
int
result2 : 4

 

참조 : https://www.youtube.com/watch?v=rk41rBXq3zQ