https://dart.dev/guides/language/concurrency
https://dart.dev/codelabs/async-await
여기서는 일단 이 2개 글을 어느 정도 보고 왔다고 가정한다.
둘 다 Future가 끝날 때까지 기다리고,
await 는 then 문법을 좀 더 읽기 쉽고 간결하게 해준다.
await 는 async 블록 안에서만 사용 가능하다.
대부분 이정도로 파악한다.
결론만 말하면, then은 몰라도 상관없다.
일단 언어에서의 지위가 다르다.
dart와 거의 문법이 비슷한 JS 에서는 await 가 무려 연산자 이고,
dart에서는 키워드 이다.
그에 비해 then은 그냥 Future 클래스의 메소드 인데, JS에서도 Future와 이름만 다른 Promise 의 메소드다.
await 는 Future 인스턴스의 Complete 됐을 때의 값을 가져오고, then 은 Future 에 Complete 됐을 때의 콜백을 등록하는 것이다.
await 는 Future가 Complete 되는 것을 기다리고, then 은 그저 콜백만 등록할 뿐이다.
아래 코드를 보자.
3개의 버튼이 있다.
빨간 버튼은 await 을 이용해서 구현하였고, 파란 버튼은 then, 초록색 리셋 버튼은 원래 문자로 돌려놓는 버튼이다.
awaitButtonPressed 와 thenButtonPressed 메소드가 있는데, 각각 빨간색과 파란색 버튼을 눌렀을 때 호출 되는 메소드다.
코드를 보고 동작을 예측해보자. 특히, 텍스트가 바뀌는 시점을 잘 생각해보자.
<해답>
dialog를 띄우고, 콜백을 등록한다. 아래에 있는
setState(() {
msg = 'then pressed';
});
가 실행 되면서 텍스트가 then pressed로 바뀐다.
dialog 가 끝날 때 까지 기다린다.
dialog 가 끝나면 페이지를 전환한다.
페이지에서 돌아오면 위의 텍스트가 I’m back 으로 바뀐다.
await 를 써야 하는 이유 ( 99% 의 상황 )
위 블로그의 정리가 기가 막히므로 여기에는 쓰지 않는다.
then 을 써야 하는 이유
정말 가끔 있는데, 위 코드 같은 경우 awaitButtonPressed 메소드에 린터 에러가 하나 있을 것이다.
이럴 때 then을 써주면 된다.
다른 케이스는 기억나면 추가하도록 하겠다.
기다리지 않고 코드들을 수행 = then, 기다릴 때 => async/ await 같은 설명을 보곤 하는데,
기다리지 않으려면 async 블록 안에서 await를 안 쓰면 된다. async/await 와 then 중에 고르는 경우 (위의 5번 케이스) 는 거의 없고 , 그냥 async/await 문법을 쓰면 된다. 즉, then 문법은 몰라도 아무 지장없다.