Future then vs await async 비교 및 쓰는 법
1.위의 기능을 쓰는 이유
플러터는 기본적으로 단일 쓰레드로 동작한다. 이말인 즉 코드가 한줄 한줄 실행이 되므로 특정 코드에서 시간이 오래 걸리면 다음으로 넘어 갈 수 없다는 뜻이기도 하다.
하지만 Future then, await&async를 쓰게 한줄의 코드가 오래 걸려도 다음 줄을 실행 할 수 있다. 웹쪽을 먼저 공부한 사람들이라면 쉽게 알겠지만
(참고로 앱을 공부하면서... 웹쪽부터 먼저 파볼껄.. 하는 생각이 엄청 많이 들기는 했다. 웹쪽의 사례를 들고 있는경우가 많았기 때문에..)
데이터를 받아오는 구간이 있는 경우 Promise라는 것을 써서 다음코드의 딜레이를 막아주는것과 비슷하다.
날씨 데이터를 받아 올 때 웹을 통해서 데이터를 Get할 때 딜레이가 발생할텐데, 만약 이 딜레이가 지속되면 다음 코드가 실행되지 않거나 앱이 멈춰버린다. 이를 막기 위한 용도라고 생각하면 좋다.
그렇다면 Future then와await async는 무엇이 다를까?
2.Future에 대하여
Future는 말에서 느껴지느 뉘앙스 그대로 미래의 뭔가가 올것을 받을 수 있는 변수이다.
위의 두가지 방법 모두 Future를 쓰긴 해야하지만 then을 쓸 것인지 await async를 쓸 것인지에 따라 용법과 용도가 달라지는데 결론적으로는 내가 볼땐 둘다 비슷하다. 반환받은 데이터원본을 유지하느냐 못하느냐의 차이만 있을 뿐.
3.비교
1) 일반 메서드가 Future 형 메서드를 이용할 때
//import 'dart:async'; <-async가 기본 다트에 이제 포함이 되었는지 임포트 없이 동작 가능
void main() {
//날씨를 불러오는 해당 메서드에서 딜레이가 걸려있기 때문에
//온전한 정보를 불러 올 수 없다.(1초)
PrintNowWeather();
PrintLunchTIme();
PrintMySalary();
}
void PrintNowWeather() {
var weatherData = NowWeather();
print(weatherData);
}
Future<String> NowWeather(){
//여기서 딜레이 발생 시키고 퓨쳐로 리턴
return Future.delayed(
Duration(seconds: 1),
(){
return '날씨 정보'*20;
}
);
}
void PrintLunchTIme(){
print('점심시간은 2:30입니다');
}
void PrintMySalary(){
print('5000만원 입니다');
}
결과
Instance of '_Future'
점심시간은 2:30입니다
5000만원 입니다
퓨쳐 값을 불러올 수 없다.
2) Future에 await async를 곁들일 때
void main() {
PrintNowWeather();
PrintLunchTIme();
PrintMySalary();
}
//달라진부분 async, await추가
//asyn : 싱크를 맞추겠습니다.
//await : 싱크를 맞추기 위해 future를 기다리겠습니다.
void PrintNowWeather() async{
var weatherData = await NowWeather();
print(weatherData);
}
Future<String> NowWeather(){
return Future.delayed(
Duration(seconds: 1),
(){
return '날씨 정보'*20;
}
);
}
void PrintLunchTIme(){
print('점심시간은 2:30입니다');
}
void PrintMySalary(){
print('5000만원 입니다');
}
결과
점심시간은 2:30입니다
5000만원 입니다
날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보
async await으로 변수에 String값을 그대로 갖다가 쓸 수 있다. 즉 데이터 원본을 그대로 쓸 수 있다는 장점이 있다.
3) Future에 then을 곁들일 때
void main() {
PrintNowWeather();
PrintLunchTIme();
PrintMySalary();
}
void PrintNowWeather(){
//달라진부분: then을 바로 이용
NowWeather().then(
//then을 쓰면 람다식으로 아래와 같이 함수를 바로 실행 시키는 용도로 주로 쓰이는것으로 보임.
(returnResult)=>{print(returnResult)});
}
Future<String> NowWeather(){
return Future.delayed(
Duration(seconds: 1),
(){
return '날씨 정보'*20;
}
);
}
void PrintLunchTIme(){
print('점심시간은 2:30입니다');
}
void PrintMySalary(){
print('5000만원 입니다');
}
결과
점심시간은 2:30입니다
5000만원 입니다
날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보
4) then형식으로 변수에 데이터를 저장하려고 시도하였으나 실패..
void PrintNowWeather(){
String weatherData;
NowWeather().then(
(returnResult)=>{weatherData = returnResult});
print(weatherData);
}
이유를 알고 싶다..
결론
then은 람다로 바로 함수 실행할 때 쓰고, async await는 데이터가공이 필요할 때 쓰는듯...
Author And Source
이 문제에 관하여(Future then vs await async 비교 및 쓰는 법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@juni416/Future-then-vs-await-async-비교-및-쓰는-법저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)