본문 바로가기
Dart (Flutter)

[Dart] Asynchronous

by llHoYall 2023. 2. 10.

Dart는 비동기 프로그래밍을 지원합니다.

다른 언어들을 통해 많이들 보셨을 async/await keyword를 사용합니다.

async and await

비동기 함수를 작성하려면, async keyword를 함수의 body 앞에 붙여줍니다.

비동기 함수 내에서, 비동기 처리를 하려면 원하는 statement 앞에 await keyword를 붙여줍니다.

즉, await keyword는 async 함수 내에서만 사용할 수 있습니다.

또한, await keyword는 여러 차례 호출할 수 있습니다.

비동기 함수는 주로 Future object를 반환합니다.

void asyncFunc() async {
  await delayedFunction();
}

Future<void> asyncFunc() async {
  await delayedFunction();
}

async 함수는 첫 번째 await statement를 만날 때까지 동기적으로 동작합니다.

나머지 코드들은 이 await statement가 끝난 이후에 다시 동기적으로 동작합니다.

Handling the Asynchronous Function

비동기 함수의 반환 값을 사용하려면 then() method를 사용하면 됩니다.

void main() async {
  await getUserName().then((value) => {
    print(value)
  });
}

Future<String> getUserName() async {
  var userName = await getHoYa();
  return userName;
}

String getHoYa() {
  return 'HoYa';
}

Handling the Errors

비동기 함수의 에러를 처리하려면 catchError() method를 사용하면 됩니다.

void main() async {
  await getUserName().then((value) => {
    print(value)
  }).catchError((e) => {
    print("Got Error: $e")
  });
}

Future<String> getUserName() async {
  var userName = await getHoYa();
  return userName;
}

String getHoYa() {
  throw new Exception('No name');
  return 'HoYa';
}

await for

주로 Stream을 얻을 때 사용하는 문법 표현입니다.

다음과 같은 형태로 사용을 하게 됩니다.

await for (varOrType identifier in expression) { ... }

ExpressionStream type이어야 합니다.

이 구문을 사용하면 Stream이 끝날 때까지, 값을 받을 때마다 body 부분을 수행합니다.

즉, 비동기적 반복문처럼 생각하시면 될 것 같아요.

void main() async {
  await for (final request in requestServer) {
    handleRequest(request);
  }
}

Wrap Up

I/O를 사용하는 경우 비동기 프로그래밍이 주로 사용되므로, 꼭 익혀두시길 바랍니다.

문법적으로는 다른 언어들과 거의 유사해서 어려움은 없을 것 같습니다.

'Dart (Flutter)' 카테고리의 다른 글

[Dart] Library  (0) 2023.02.10
[Dart] Generator  (0) 2023.02.10
[Dart] Exception Handling  (0) 2023.02.09
[Dart] Generics  (0) 2023.02.08
[Dart] Enumerated Type  (0) 2023.02.08

댓글