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);
}