async 및 await를 사용하는 코드는 비동기식이지만 동기식 코드와 유사합니다. 아래 코드는 await를 사용하여 비동기 함수의 결과를 기다리는 코드입니다.
final version =awaitlookUpVersion();
await를 사용하려면 반드시 함수 선언이 async로 되어야 합니다.
Future<void> checkVersion() async {// lookUpVersion() 함수는 비동기 함수지만,// lookUpVersion() 처리가 완료될때까지 대기했다가 다음 행의 코드가 수행됩니다.var version =awaitlookUpVersion();// version을 알았으므로 version을 처리합니다.}
await를 사용할 경우 동기식 코드와 동일한 방법으로 예외 처리합니다.
try { version =awaitlookUpVersion();} catch (e) {// 버전 조회에 실패한 경우 예외 처리를 합니다.}
async 함수에서 await를 여러번 사용할 수 있습니다.
var entrypoint =awaitfindEntryPoint();var exitCode =awaitrunExecutable(entrypoint, args);awaitflushThenExit(exitCode);
await 표현식에서 표현식의 값은 Future입니다. 만약 Futrue 타입이 아닌 경우 자동으로 Future로 래핑(Wrapping)됩니다. Future 객체는 비동기 처리의 결과로 객체를 반환한다는 약속을 나타냅니다. await 표현식의 값은 반환된 객체입니다. await 표현식은 객체를 사용할 수 있을 때까지 실행을 일시 중지합니다.
await를 사용할때 컴파일 타임 에러가 발생한다면 해당 함수가 async로 선언되었는지 확인하세요. 예를 들어 main() 함수 바디에서 await를 사용한다면 main() 함수도 async 함수로 선언되어야 합니다.
voidmain() async {checkVersion();print('In main: version is ${await lookUpVersion()}');}
비동기 함수 선언하기
async 함수는 함수 바디 앞에 async 키워드를 붙여서 선언합니다. 함수에 async를 추가하면 Future를 반환합니다. String을 반환하는 동기식 함수를 예로 들어보겠습니다.
StringlookUpVersion() =>'1.0.0';
만약 버전을 확인하는데 시간이 오래 걸릴 것으로 예상한다면 async 함수로 선언합니다. 이 경우 반환 값은 Futrue<String>이 됩니다.
Future<String> lookUpVersion() async=>'1.0.0';
함수의 바디에는 Future API를 사용할 필요가 없습니다. Dart는 필요한 경우에 자동으로 Future 객체를 생성해 반환합니다. 만약 함수가 값을 반환하지 않는다면 Future<void> 타입을 반환합니다.