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