RxJS Expand Reduce Loop не возвращает результат

Я пытаюсь составить список результатов с разбивкой по страницам. У меня есть цикл, но я могу получить наблюдаемое, чтобы выдать окончательный результат. Он зацикливается на завершении, но никогда не отправляется на подписку. Не уверены, что использование EMPTY - неправильный способ завершения, или сокращение не выполняется из-за EMPTY и просто никогда не приводит к последнему результату?

getReportsAll(collection: Collection): Observable<PagedResult<ReportView>> {
return Observable.create(observer => {
  this.collectionService.collectionBy(collection)
  const url = this.collectionService.buildUrl(this.reportsUrl)
  const newPage = new PagedResult<ReportView>([], null, null, 0)
  this.getReportPage(url)
    .pipe(
      expand(result => {
        const skip = collection.pageBy.skip + collection.pageBy.top
        collection.pageBy = new PageBy(collection.pageBy.top, skip)
        this.collectionService.collectionBy(collection)
        const nextUrl = this.collectionService.buildUrl(this.reportsUrl)
        const test = result.count >= collection.pageBy.top ? this.getReportPage(nextUrl) : EMPTY
        console.info('test', test)
        return test
      }),
      reduce((next: PagedResult<ReportView>, data: PagedResult<ReportView>, index: number) => {
        next.value = [...next.value, ...data.value]
        next.count = next.value.length
        console.info('next', next, index)
        return next
      }, newPage),
    )
    // .catch(error => observer.error(error))
    .subscribe(results => {
      console.info('results', results)
    })
})

}

Что здесь за константа EMPTY?

Fan Cheung 31.07.2018 05:57

Это то же самое, что empty (), должно запускать complete () для наблюдаемого: rxjs-dev.firebaseapp.com/api/index/const/EMPTY

Daniel 31.07.2018 06:08
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
2
710
1

Ответы 1

Я решил, что мне не хватало takeWhile (), вот полное решение на случай, если кто-то еще захочет сделать что-то подобное.

  getReportsAll(collection: Collection): Observable<PagedResult<ReportView>> {
this.collectionService.collectionBy(collection)
const url = this.collectionService.buildUrl(this.reportsUrl)
const newPage = new PagedResult<ReportView>([], null, null, 0)
return this.getReportPage(url).pipe(
  expand(result => {
    const skip = collection.pageBy.skip + collection.pageBy.top
    collection.pageBy = new PageBy(collection.pageBy.top, skip)
    this.collectionService.collectionBy(collection)
    const nextUrl = this.collectionService.buildUrl(this.reportsUrl)

    return result.count >= collection.pageBy.top ? this.getReportPage(nextUrl) : of(null)
  }),
  takeWhile((value: PagedResult<ReportView> | Observable<void>, index: number) => {
    if (value === null) {
      return false
    }
    return true
  }),
  reduce((next: PagedResult<ReportView>, data: PagedResult<ReportView>, index: number) => {
    next.value = [...next.value, ...data.value]
    next.count = next.value.length
    return next
  }, newPage),
)

}

Вы также удалили этот Observable.create(observer => ...., который довольно сбивал с толку.

Picci 31.07.2018 07:38

Да, извините, мне это не нужно, потому что я вызываю его где-то еще, но это просто оболочка для создания наблюдаемого

Daniel 01.08.2018 06:21

Другие вопросы по теме