비동기 처리에 대해 배운 후 문제를 풀다가 막히는 부분이 있어 정리해보는 글.
Future<String> timeoutFuture() async {
await Future.delayed(Duration(seconds: 6));
return 'ok';
}
void main() async {
print(timeoutFuture());
}
위 코드에서 나는 6초 뒤에 ok를 출력하고 싶었다. 하지만, Instance of Future<String>
이라고 출력되었다. 이 문제를 어떻게 해결할까? Future와 async-await 개념을 이해하면 문제가 보일 것이다.
자바스크립트의 Promise와 같은 개념으로, 미래에 받아올 값이라는 것을 명시해주는데 쓰인다. Future를 사용할 떄 async를 꼭 사용해줘야 하는데, Future는 비동기 처리가 필수이기 때문이다.
async로 정의된 비동기 함수를 실행할때, 꼭 await 키워드를 사용해야 코드가 작성된 순서대로 실행된다.
Future<void> test() async { await Future.delayed(Duration(seconds: 5)); print("Hello"); }
이 코드에서 test를 호출했을때, 5초 있다가 Hello 메세지를 출력하려면 delayed에 await를 사용해야 한다. 단순히 delayed만 썼다고 비동기 처리가 되는 것이 아니다.
코드의 문제는 timeoutFuture()를 출력할때 await을 사용하지 않았기 때문이다. timeoutFuture()은 비동기 함수이기 때문에 호출이 되면 바로 Future 객체가 반환된다. 그래서 await을 사용해 Future 객체가 완료될때까지 기다리게 해야 한다.