최근에 do {} while 문을 사용하는데 내부 로직에서 무한루프가 도는 문제가 생겼었습니다.
REST API를 호출하여 result 값을 조건으로 사용하는 로직이었는데 도무지 원인을 알수가 없었습니다.
(해당 코드가 테스트 과정에서 임시로 사용했던 코드라 지금은 어떤 내용이었는지 기억이 나질 않네요 ㅠ.ㅠ)
어쨌듯 한시간 가량 왜 그런 문제가 발생했는지 찾아보다
Future.doWhile 이란 놈을 알게 되었습니다.
그래서 이 문법을 사용하는 코드를 공유해보려고 합니다.
문법 자체는 엄청 단순한데요.
아래의 코드와 같이 Future.doWhile을 사용하는 것입니다.
Future.doWhile(() async {
// do something
});
일반적인 do {} while 구문과의 차이점이라면 break; 대신 return false;를 이용해 loop문을 빠져나와야 한다는 점입니다.
그럼 이만.
import 'dart:math';
void main() async {
print("Case 1. while");
int i = 5;
while(i <= 3){
print("Int i : $i");
i++;
}
print("\nCase 2. do while");
i = 5;
do{
print("Do Int i : $i");
i++;
}while(i <= 3);
print("\nCase 3. Future.doWhile문");
var value = 0;
await Future.doWhile(() async {
value++;
await Future.delayed(const Duration(seconds: 1));
print('$value초 후');
if (value == 3) {
print('Finished with $value');
return false;
}
return true;
});
print("\n테스트 완료");
}
결과는 다음과 같습니다.
Case 1. while
Case 2. do while
Do Int i : 5
Case 3. Future.doWhile문
1초 후
2초 후
3초 후
Finished with 3
테스트 완료
# 참고 1 #
Future 함수 문법 중 제가 자주 사용하는것을 공유해드립니다.
1. Future.delayed
- duration 동안 멈추고 싶을때 사용
- Future.delayed(const Duration(milliseconds: 1000));
2. Future.wait
- 다수의 future가 모두 완료된 이후를 처리하고 싶을때 사용 (ex, loading 효과 완료)
- await Future.wait([
Future.delayed(const Duration(seconds: 1)),
Future.delayed(const Duration(seconds: 2)),
Future.delayed(const Duration(seconds: 3)),
]).then((_) {
// 3초후 완료, do something
});
3. Future.any
- 다수의 future 중 가장 먼저 완료된 future가 return 됨
- await Future.any([
Func1sec(), // 1초 후 return '1sec'
Func2sec(), // 2초 후 return '2sec'
Func3sec(), // 3초 후 return '3sec'
]).then((result) {
// 1초 후 완료
print(result); // '1sec' 출력
});
# 참고 2 #
1. Future.doWhile과 유사한 문법으로 Future.forEach 구문도 있습니다.
2. 같이 보면 좋은 문법으로 이런것도 있습니다.
- Future.value : 정해진 값을 return 할때 사용
- Future.microtask : 비동기로 실행되는 Future들 중 우선순위를 높여 먼저 실행하고 싶을때 사용
- Future.sync : 즉시 실행되길 원하는 Future를 사용하고 싶을때 사용
'Development > Dart' 카테고리의 다른 글
[Dart 문법] 함수 파라미터 [] 과 {} 차이점 (0) | 2023.02.23 |
---|---|
[팁&노하우] 정규표현식을 이용하여 한글 여부 판별하기 (0) | 2023.02.17 |