Future then vs await async 비교 및 쓰는 법

Jooni·2020년 11월 11일
0

Jooni_ Flutter 오답노트

목록 보기
16/26

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는 데이터가공이 필요할 때 쓰는듯...

profile
이해가 안돼시거나 질문이 있으신 분들은 댓글로 남겨주세요. 성심성의껏 응하겠습니다!

1개의 댓글

comment-user-thumbnail
2022년 11월 8일

해결하셨을 수 있지만 4) 번에 대해 실패한 이유를 말씀드리자면, then 내에 있는 (returnResult) => {weatherData = returnResult} 가 실행되기 이전에 print(weatherData)가 먼저 실행되고 그 이후에 then의 콜백함수가 실행되기 때문에 실패하신거에요

답글 달기