flutter에서 db에 저장할 때나 http 요청 등에 많이 쓰이는 Future에 대해 간략히 정리한다.
Future, async, await
flutter의 Future는 javascript의 promise와 유사하다. 미래의 어느 시점에 사용간으한 value를 표현하기 위해 사용한다.
http package에서 get, post 등의 method를 통해 받는 response라든가 new Future 생상자를 통해서 Future Object를 얻을 수 있다.
Future에 관한 대략적인 정보는 아래와 같다.
- Future Object의 상태
pending: 프로세스가 진행중
complete: 프로세스 완료, 세부적으로 complete with value와 complete with error로 분류된다
- Future.then * try
Future가 complete 되었을 때 callback을 추가하기 위해 사용되는 method다
var future = ... return future object ...
future.then((value){
print('success');
}, onError: (error){
print('error');
}
});
- Future.catchError * catch
future.then의 onError는 해당 Future 의 error만 처리한다. future가 체이닝되어 발생할 때 한번에 잡기 위해서는 catchError를 사용해야 한다.
new Future.value(1).then(v)({
return Future.error('error');
}).then((v){
return Future.value(v);
})catchError((error){
print('error');
});
- Future.whenCompelete * finally
var future = ... return future object ...
future.then(print).catchError(print).whenCompelete((){
print('done');
});
- Future.timeout
timeout에서 설정한 시간이 지난 후에 TimeoutException을 발생시킨다
future.delayed(Duration(seconds: 5), (){
return '1';
}).timeout(Duration(seconds: 2)).then(print).catchError(print);
또는 시간이 지난 후 기본값 리턴
future.delayed(Duration(seconds: 5), (){
return '1';
}).timeout(Duration(seconds: 2), onTimeout:(){
return 'default value';
}).then(print).catchError(print);
- async, await
Future가 chain을 이룰 경우 코드가 더러워지기 때문에 async와 await을 사용한다.
Future를 동기처리 코드처럼 사용하게 된다.
void main() async {
var future = Future.delayed(Duration(seconds: 3), () => {return 1});
// await은 Future의 결과를 기다린다
var rslt = await future;
print(rslt); // rslt 는 1
}
async, await 사용시 error 처리는 try ~ catch ~ finally 구문을 사용한다.
void main() async {
var future = Future.delayed(Duration(seconds: 3), () => {return Future.error('error')});
try{
var rslt = await future;
print(rslt);
}catch(e){
print(e);
}finally{
print('done');
}
}
Future 체이닝이 이루어지는 경우 async, await을 사용하면 callback hell을 방지할 수 있다.
void main() async{
var f1 = (int value) async => v+1;
var f2 = (int value) async => v+2;
var f3 = (int value) async => v+3;
var value=100;
value = await f1(value);
value = await f2(value);
value = await f3(value);
print(value);
}
** 참고: https://flutter-academy.com/async-in-flutter-futures/