플러터는 기본적으로 단일 쓰레드로 동작한다. 이말인 즉 코드가 한줄 한줄 실행이 되므로 특정 코드에서 시간이 오래 걸리면 다음으로 넘어 갈 수 없다는 뜻이기도 하다.
하지만 Future then, await&async를 쓰게 한줄의 코드가 오래 걸려도 다음 줄을 실행 할 수 있다. 웹쪽을 먼저 공부한 사람들이라면 쉽게 알겠지만
(참고로 앱을 공부하면서... 웹쪽부터 먼저 파볼껄.. 하는 생각이 엄청 많이 들기는 했다. 웹쪽의 사례를 들고 있는경우가 많았기 때문에..)
데이터를 받아오는 구간이 있는 경우 Promise라는 것을 써서 다음코드의 딜레이를 막아주는것과 비슷하다.
날씨 데이터를 받아 올 때 웹을 통해서 데이터를 Get할 때 딜레이가 발생할텐데, 만약 이 딜레이가 지속되면 다음 코드가 실행되지 않거나 앱이 멈춰버린다. 이를 막기 위한 용도라고 생각하면 좋다.
그렇다면 Future then와await async는 무엇이 다를까?
Future는 말에서 느껴지느 뉘앙스 그대로 미래의 뭔가가 올것을 받을 수 있는 변수이다.
위의 두가지 방법 모두 Future를 쓰긴 해야하지만 then을 쓸 것인지 await async를 쓸 것인지에 따라 용법과 용도가 달라지는데 결론적으로는 내가 볼땐 둘다 비슷하다. 반환받은 데이터원본을 유지하느냐 못하느냐의 차이만 있을 뿐.
//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만원 입니다
퓨쳐 값을 불러올 수 없다.
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값을 그대로 갖다가 쓸 수 있다. 즉 데이터 원본을 그대로 쓸 수 있다는 장점이 있다.
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만원 입니다
날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보날씨 정보
void PrintNowWeather(){
String weatherData;
NowWeather().then(
(returnResult)=>{weatherData = returnResult});
print(weatherData);
}
이유를 알고 싶다..
then은 람다로 바로 함수 실행할 때 쓰고, async await는 데이터가공이 필요할 때 쓰는듯...
해결하셨을 수 있지만 4) 번에 대해 실패한 이유를 말씀드리자면, then 내에 있는 (returnResult) => {weatherData = returnResult} 가 실행되기 이전에 print(weatherData)가 먼저 실행되고 그 이후에 then의 콜백함수가 실행되기 때문에 실패하신거에요