작성
·
264
0
안녕하세요! 또 궁금한게 생겨서 질문을 올립니다!
http request로 pagination되어 있는 데이터를 모두 가져오려고 하는데요!
우선 1~100페이지정도 까지 계속 데이터를 수집하다가 어느순간에 결과가 빈배열로 응답이 오면
요청을 멈추도록 구현하고 싶습니다.
ex)
URI/1 -> [a,b,c] -> 10초 걸림
URI/2 -> [d,e,f] -> 8초 걸림
URI/3 -> [] -> 1초걸림
이런상황에 3번째에서 멈춘뒤 [a,b,c,d,e,f] 의 결과를 얻고 싶습니다.
현재는
range(1,100).pipe(
concatMap((number) => http.get(`URL/${number}`))
takewhile((value)=> value.length)
reduce((acc,cur) => acc.concat(cur), [])
이런식으로 빈배열이 응답오면 멈추는 식으로 구현되어 있습니다!
이걸 mergeMap으로 동시성을 조금 올려보고 싶은데,
mergeMap으로 하니 각 요청마다 응답에 걸리는 시간이 다른 이유 때문에(추측),
데이터가 담겨잇는 응답은 늦게 오고
데이터가 담겨 있지 않은 빈배열은 응답이 먼저 도착해서
takewhile 조건에걸려서 종료되어 버리는 문제가 발생하고 있습니다.
pagination으로 가져온 데이터의 순서는 중요하지 않아서 종료조건만 해결하면 될것같은데,
종료조건때문에 순서를 정렬할수있는 방법을 고려해야하나 싶은데요
이런 문제를 해결하고 싶은데
제가 생각한대로 mergeMap의 순서를 정렬하는 방법을 강구해보는게 맞을까요?
더 쉽게 해결할 수 있는 방법이 있을까 해서 질문 올립니다!
답변 2
1
안녕하세요, 얄코입니다.
그러한 경우, 빈 배열이 왔을 시 요청을 보내는 것은 바로 종료하되
받아온 것들을 추려서 작업을 시작하는 것은
서브젝트를 사용해서 요청을 보낸 갯수를 기록하고
그 갯수만큼 응답이 돌아와야 실행하는 식으로 문제 해결이 가능할 것 같습니다.
즉 보낸 응답은 다 받아야 일을 시작한다는거죠.
알고리즘적으로 더 좋은 방법은 시간이 된다면 저도 고민해보겠습니다.
(RxJS의 사용에 관련해서는 제가 얼마든 신속히 답변을 드리려 하는데
이를 복잡한 실무에 적용하는 프로그래밍의 영역은 저도 시간을 따로 내야 가능합니다.
이부분 양해를 부탁드립니다.)
감사합니다!
0