Future / async - await
안녕하세요, 선생님.
기초적인 것 같은데 이해되지 않는 부분이 있어 질문드립니다.
다트 공식문서상에 있는 예제입니다.
void main(){
print(createOrderMessage());
}
String createOrderMessage() {
var order = fetchUserOrder();
return 'Your order is $order';
}
Future<String> fetchUserOrder() async {
return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte');
}
결과:
Your order is Instance of 'Future<String>'
로직적으로 해석를 시도해보았고 다른 예제들도 실행하면 잘 되는데..이 예제만 궂이 main함수에 Future를 집어 넣어주야 'Large Latte'를 받을 수 있다는게 ....기본 강의를 돌려보아도 이해가 되지 않는데...좀 상세히 설명 해 주실 수 있을까요?
답변 8
0
Future 사용시 return 값은 String이여도 await를 써 주지 않으면 리턴되지 않는 다는 것을 print()와 동일 선상에서 이해하려 했던 것 같습니다. 강조된 await에 이해하였습니다. 감사합니다.
"Future는 비동기 실행으로 반환 받을 수 있는 값을 이야기합니다.
await를 하지 않으면 비동기 실행이 끝날때까지 기다리지 않기때문에 미래에 받는 타입인 Future 타입이 그대로 반환됩니다."
0
print()는 출력하려는 값을 파라미터에 입력하는 함수입니다. 함수에 await 하지 않은 반환값을 입력하셨으니 Future 타입이 출력되는게 맞습니다. await를 하면 Future가 벗겨진 타입을 반환받으니 예상하시는 결과가 나옵니다.
0
위 두개의 코드의 main함수 내에서는 당연히 동기식이라 End 가 먼저 찍히는다는 것은 알고 있습니다...
다만 두개의 코드를 실행해 보면 print(addNumbers(1,1)) 담으면 결과값이 Instance of 'Future<String>'으로 나오는 것이 이해가 되지 않아 print() 의 특징 혹은 예외 같은내용이 있는지 궁금합니다. 혹은 제가 잘 이해를 하고 있는 못하는 것일까요?
0
print(addNumbers(1,1))이 아니라 print(await addNumbers(1,1))을 실행하셔야합니다. 예외가 아니라 이미 말씀드린것처럼 Future 타입을 벗겨내려면 무조건 await를 하셔야합니다. 그 이유는 위에 설명드린바와 같습니다.
0
void main() {
print('Start');
addNumbers(1,1);
print('End');
}
Future<void> addNumbers(int x, int y) async {
print('addNumbers Start');
final result = await Future.delayed(const Duration(seconds: 3), () {
print('Waiting.......');
return x + y;
});
print('addNumbers End');
print('$x + $y = $result');
}
0
end가 마지막에 실행되지 않는 이유는 addNumbers() 함수를 await 하지 않으셔서 그렇습니다. 이부분은 제 다트언어 비동기편에서도 다루고있으니 확인해주세요! 다트언어 버그는 절대 아닙니다.
0
void main() {
print('Start');
print(addNumbers(1,1));
print('End');
}
Future<String> addNumbers(int x, int y) async {
print('addNumbers Start');
final result = await Future.delayed(const Duration(seconds: 3), () {
print('Waiting.......');
return x + y;
});
print('addNumbers End');
return '$x + $y = $result';
}
0
print(Object) vs Object의 차이가 있는 것 같습니다.
Object = function...
똑같은 코드에서 Object 내에서 print()로 Future<void> 형식으로 하면 잘 작동되나 Future<String> 같은 값으로 하면 전혀 작동하지 않습니다. Dart언어의 버그 같기도 하고 혹은 제가 알지 못하는 print()함수의 특징적인 기능이 있는 것일까요? 기본 개념이 양자적으로 이해해야 하는 것인지요?....
0
안녕하세요. 무슨말씀이신지 정확히는 모르겠으나 다트언어의 버그일리는 없을 것 같습니다. print(Object)와 Object는 당연히 같지 않습니다. print()는 함수고 Object는 Object니까요. 예상하는대로 작동되지 않는 코드를 올려주시고 어떤부분이 어떻게 자독하길 예상하는지, 실제로 어떻게 작동하는지 말씀주시면 확인해보겠습니다.
0
void main(){
print(createOrderMessage());
}
Future<String> createOrderMessage() async {
var order = await fetchUserOrder();
return 'Your order is $order';
}
Future<String> fetchUserOrder() async {
return await Future.delayed(const Duration(seconds: 2), () => 'Large Latte');
}
결과값: Instance of '_Future<String>'
이런결과가 나옵니다.....??-_-;;
0
아 그 이유는 main() 함수에서도 await를 하셔야하기때문입니다. 이유는 위 설명드린바와 같습니다.
print(createOrderMessage());
물론 main 함수도 async로 설정하셔야합니다.
0
안녕하세요!
질문을 정확하게 이해했는지 모르겠습니다.
하지만 현재 Your Order is Large Latte라는 결과값을 받고싶으시면 fetchUserOrder()를 await fetchUserOrder()로 변경하셔야합니다.
Future는 비동기 실행으로 반환 받을 수 있는 값을 이야기합니다.
await를 하지 않으면 비동기 실행이 끝날때까지 기다리지 않기때문에 미래에 받는 타입인 Future 타입이 그대로 반환됩니다.
await를 하게되면 비동기 작업이 끝날때까지 기다리기때문에 Future 타입을 벗겨낸 실제 타입, 즉 String 값을 받을 수 있습니다.
감사합니다.
198강 (){onTap(e);}의 이해 돕기
0
39
1
video_call 플러그인 설치후 에러 발생
0
47
1
SDK 안드로이드 설치 질문!
0
62
1
코드팩토리 디스코드 링크 다시 부탁드려요~
0
93
1
Webview를 이용해서 URL 상의 페이지 출력 불가
0
71
1
홈스크린 함수를 함축해서 main.dart에 옮기는 문제
0
56
1
플레이스토어
0
60
1
아고라 엔진 init 함수의 반환타입이 Future<void> 이것의 의미는 무엇인가요?
0
56
1
가이드라인 질문
0
59
0
emulator 에러 환경설정 뭐가 문제 일까요??
0
78
1
emulator 실행 오류
0
95
3
Column을 가로방향 최대 사이즈를 차지하도록 하는 방법에 관련
0
73
1
pubspec.yaml에서 font를 추가하면서 weight 값을 지정하는 것이 의미가 있는 것인지 문의
0
44
1
setState()를 호출하지 않으면 build가 실행 안되는 건가요?
0
54
1
video_call 플러그인 설치시 에러문제
0
67
1
children 안의 if 문에서 { } 못쓰는 이유?
0
51
1
이렇게 오류가 떠요
0
67
1
AppBar 사용했는데
0
63
2
[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다
0
58
1
StatefulWidget 실습 에러가 발생합니다.[해결완료]
0
65
1
Video Player 프로젝트에 대한 추가 질문
0
54
0
Row위젯이나 column위젯의 위치는 누가 정하나요??
0
43
1
geolocator 오류때문에 개발진행이 불가능입니다
0
64
1
API 관련 이슈
0
89
2





