inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

352

elcy12

작성한 질문수 6

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를 거쳐야만 하는지 잘 모르겠습니다.

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

 

 

flutter 클론코딩

답변 1

0

코드팩토리

안녕하세요!

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

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

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

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

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

감사합니다!

0

elcy12

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

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

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

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

0

코드팩토리

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

0

코드팩토리

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

0

elcy12

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

198강 (){onTap(e);}의 이해 돕기

0

39

1

video_call 플러그인 설치후 에러 발생

0

47

1

SDK 안드로이드 설치 질문!

0

62

1

코드팩토리 디스코드 링크 다시 부탁드려요~

0

93

1

Webview를 이용해서 URL 상의 페이지 출력 불가

0

71

1

홈스크린 함수를 함축해서 main.dart에 옮기는 문제

0

56

1

플레이스토어

0

60

1

아고라 엔진 init 함수의 반환타입이 Future<void> 이것의 의미는 무엇인가요?

0

56

1

가이드라인 질문

0

59

0

emulator 에러 환경설정 뭐가 문제 일까요??

0

78

1

emulator 실행 오류

0

95

3

Column을 가로방향 최대 사이즈를 차지하도록 하는 방법에 관련

0

73

1

pubspec.yaml에서 font를 추가하면서 weight 값을 지정하는 것이 의미가 있는 것인지 문의

0

44

1

setState()를 호출하지 않으면 build가 실행 안되는 건가요?

0

54

1

video_call 플러그인 설치시 에러문제

0

67

1

children 안의 if 문에서 { } 못쓰는 이유?

0

51

1

이렇게 오류가 떠요

0

67

1

AppBar 사용했는데

0

63

2

[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다

0

58

1

StatefulWidget 실습 에러가 발생합니다.[해결완료]

0

65

1

Video Player 프로젝트에 대한 추가 질문

0

54

0

Row위젯이나 column위젯의 위치는 누가 정하나요??

0

43

1

geolocator 오류때문에 개발진행이 불가능입니다

0

64

1

API 관련 이슈

0

89

2