인프런 커뮤니티 질문&답변

elcy12님의 프로필 이미지
elcy12

작성한 질문수

[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

미세먼지앱 비동기 요청 병렬의 futures 질문

작성

·

308

0

Map<ItemCode, List<StatModel>> stats = {};
List<Future> futures = [];
for (ItemCode itemCode in ItemCode.values) {

  futures.add(
    StatRepository.fetchData(
      itemCode: itemCode,
    ),
  );
}

final results = await Future.wait(futures);

for (int i = 0; i < results.length; i++) {
  final key = ItemCode.values[i];
  final value = results[i];

  stats.addAll({
    key: value,
  });
}

return stats;

다수의 비동기 요청 병렬로 처리하기 강좌를 듣다가 한가지 의문이 들어 질문드립니다.

 

futures에 모든 데이터를 받아와 await한 후 results에 넣고,

results를 이용해 마지막 for구문을 완성하셨는데,

만약 results를 거치지 않고 futures를 그대로 사용해서 for구문을 완성하면 왜 오류가 생기는지 궁금합니다.

 

await Future.wait(futures);

for(int i = 0; i < futures.length; i++) {

final key = ItemCode.values[i];

final value = futures[i];

stats.addAll({ key: value, });

}

return stats;

}

제가 생각한 코드는 이부분인데, results를 사용하지 않고 바로 futures를 사용해서 실행하면

오류가 생깁니다. 왜 이렇게 하면 안되고 꼭 results를 거쳐야만 하는지 잘 모르겠습니다.

답변 부탁드리겠습니다...

 

 

답변 1

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

results를 거치지 않는다는게 무슨 말인지 잘 모르겠습니다.

futures는 데이터를 가져오는 비동기 요청을 리스트로 모아둔 변수입니다.

results는 실제로 future 함수들을 모두 실행하고난 응답 값을 모아둔 변수입니다.

그렇기때문에 둘은 완전 다른 값들을 들고 있습니다.

거치지 않는다는게 정확히 어떤 말씀이신지 잘 모르겠어서 제가 드린 답변이 부족하다면 다시 질문 부탁드립니다!

감사합니다!

elcy12님의 프로필 이미지
elcy12
질문자

results를 꼭 거치지 않는다는게 results변수를 꼭 사용하지 않고 futures변수 자체만을 이용해서 아래 for루프 부분을 만들 수 있느냐는 의미였습니다.

final results = await Future.wait(futures); 이 부분을

await Future.wait(futures); 이렇게 바꿔서 results변수를 사용하지 않고futures 자체만 이용해서 for루프 부분을 짜봤는데 이럴경우 오류가 나서 질문드렸어요...

저는 futures변수에 있는 값과 results변수에 있는 값이 둘다 StatRepository.fetechData에 있는 동일한 환경오염데이터 값이라고 생각했는데 완전히 다른가요?

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

futures는 실행할 비동기 함수들의 await 하지 않은 반환 값들입니다. 타입은 List<Future<StatModel>>입니다. results는 이 리스트의 함수들을 전부 await하고 반환 값들을 모아논 변수입니다. 그래서 타입이 Future가 벗겨진 List<StatModel>입니다. 그렇기때문에 완전 다른 값들입니다.

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

Future.wait를 사용하고싶지 않다면 기존에 작성했던 코드대로 각각의 비동기 함수들을 await해서 코드를 작성 할 수 있습니다. 하지만 비동기 함수를 await 하지 않은 반환값과 await한 반환값을 같게 비교 할 순 없습니다.

elcy12님의 프로필 이미지
elcy12
질문자

아 이제 이해가 됐네요...! 감사합니다

elcy12님의 프로필 이미지
elcy12

작성한 질문수

질문하기