[Dart] 비동기 처리: Future, async/await

[원본 링크]

다트도 자바스크립트와 마찬가지로 비동기 문법을 적극적으로 지원한다.

일단 여기서 중요한건 Future라는 타입이다.
자바스크립트의 Promise와 거의 동일한데, 비동기 작업의 완료 등을 제어할 수 있게 해주는 특수한 타입이다.

Future에는 비동기 작업을 지원하는 몇가지 함수가 있다. 그 중 하나가 딜레이를 걸어주는 delayed 함수다.
이건 첫번째 인자로 딜레이할 시간을.
두번째 인자로 딜레이가 끝난 후에 실행해서 반환할 함수를 받는다. image

image 위의 코드는 foo()가 먼저 실행됐지만, Future 동작들은 기본적으로 다른 작업을 신경쓰지 않고 따로 돌기 때문에 다음 bar 출력이 먼저 실행되었다.

딜레이도 딜레이지만 이외에도 비동기적 처리가 유리한 부분은 매우 많다.
특히 IO가 연관되는 기능들이 대부분 그렇다.

그런데 비동기도 비동기지만. 비동기만으로는 제대로된 기능을 구현하기 어렵다.
결국엔 동기화, 그러니까 비동기 작업의 완료를 보장할 수 있는 부분이 필요한데, 가장 본질적인 방법은 이거다. image

image Future의 then 메서드는 작업 완료 후에 실행시킬 콜백함수를 전달받는다.
그리고 콜백함수는 해당 Future의 반환값을 받는다.

이러면 이제 foo 출력 후에 bar 출력을 보장할 수 있다.
제대로된 순서를 지정할 수 있다는 것이다.


async/await
근데 저런 콜백 위주의 방식은 가독성을 파괴하기 아주 좋은 녀석이다.
당장은 깊이가 하나뿐이라 괜찮지만, 3개, 4개가 넘어간다면 어떻겠는가.

이를 해결하기 위한 것이 async와 await라는 문법적 설탕이다.
Future 함수명 {...} 의 함수를
T 함수명 async {...} 로 바꿀 수 있고,

then으로 대기타서 반환값을 받던걸 await 키워드 한방으로 처리할 수 있다. image

image 이렇게 말이다.
아주 간결해졌다.

참고로 await은 Future 혹은 async 함수에서만 사용할 수 있다.


참조
https://dart.dev/codelabs/async-await
https://api.dart.dev/stable/2.10.4/dart-async/Future-class.html