Future 클래스는 비동기 작업을 할 때 사용

Future는 일정 소요시간 후에 실제 데이터나 에러를 반환

async클래스는 await 메서드를 가지고 잇으며, await메소드로 선언된 메소드는 응답이 처리될 때까지 대기하는 동기식으로 처리가 가능(데이터를 수신해서 다음 과정을 처리할 때 사용)

 

1.1 일반적인 동기적 상황(Sync)

import 'dart:io';

void main(){
  showData();
}

void showData(){
  startTask();
  acessData();
  fetchData();
}

void startTask(){
  String info1 = '요청수행 시작';
  print(info1);
}

void acessData(){
  Duration time = Duration(seconds: 3);
  sleep(time);
  String info2 = '데이터에 접속중';
  print(info2);
}

void fetchData(){
  String info3 = '잔액은 8,500원 입니다.';
  print(info3);
}

 

1.2 일반적인 비동기적상황(Async)

import 'dart:io';

void main(){
  showData();
}

void showData(){
  startTask();
  acessData();
  fetchData();
}

void startTask(){
  String info1 = '요청수행 시작';
  print(info1);
}

void acessData(){
  Duration time = Duration(seconds: 3);

  if(time.inSeconds>2){
    //sleep(time);
    Future.delayed(time, (){
      String info2 = "데이터 처리 완료";
      print(info2);
    });
  }else{
    String info2 = "데이터를 가져왔습니다.";
    print(info2);
  }
}

void fetchData(){
  String info3 = '잔액은 8,500원 입니다.';
  print(info3);
}

 

2.1 비동기처리로 인한 문제 발생

fetch함수가 acessData()함수의 리턴값이 필요한 상황

import 'dart:io';

void main(){
  showData();
}

void showData(){
  startTask();
  String account = acessData();
  fetchData(account);
}

void startTask(){
  String info1 = '요청수행 시작';
  print(info1);
}

String acessData(){
  String account="";

  Duration time = Duration(seconds: 3);

  if(time.inSeconds>2){
    //async로 처리되는 부분
    Future.delayed(time, (){
      account = "8,500만원";
      print(account);
    });
  }else{
    String info2 = "데이터를 가져왔습니다.";
    print(info2);
  }
  return account;
}

void fetchData(String account){
  String info3 = '잔액은 $account원 입니다.';
  print(info3);
}

 

2.2 문제 해결

 - 우선 acessData함수는 비동기 함수로 Future.delayed함수가 리턴이 된 후 나머지 문장이 실행된다.

 - Future.delayed함수 안에서 account값이 할당이 되고  그 값을 리턴하는데 Future<string>타입이다.

   -> 리턴타입이 Future<string>라는 것은 일정 시간 후에 Future타입을 리턴하는데 이는 문자열을 의미/ 즉, 비동기 처리를 진행하고 일정 시간 후 string을 리턴한다는 뜻

 - Future<string>타입을 리턴하는 acessData함수는 결국 showData함수에서 호출되므로 showData함수도 비동기 처리를 해줘야 한다.

import 'dart:io';

void main(){
  showData();
}

void showData() async{
  startTask();
  String account = await acessData();
  fetchData(account);
}

void startTask(){
  String info1 = '요청수행 시작';
  print(info1);
}

Future<String> acessData() async{
  String account="";

  Duration time = Duration(seconds: 3);

  if(time.inSeconds>2){
    //async로 처리되는 부분
    await Future.delayed(time, (){
      account = "8,500만원";
      print(account);
    });
  }else{
    String info2 = "데이터를 가져왔습니다.";
    print(info2);
  }
  return account;
}

void fetchData(String account){
  String info3 = '잔액은 $account원 입니다.';
  print(info3);
}

+ Recent posts