Я пытаюсь составить список результатов с разбивкой по страницам. У меня есть цикл, но я могу получить наблюдаемое, чтобы выдать окончательный результат. Он зацикливается на завершении, но никогда не отправляется на подписку. Не уверены, что использование 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 (), должно запускать complete () для наблюдаемого: rxjs-dev.firebaseapp.com/api/index/const/EMPTY





Я решил, что мне не хватало 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 => ...., который довольно сбивал с толку.
Да, извините, мне это не нужно, потому что я вызываю его где-то еще, но это просто оболочка для создания наблюдаемого
Что здесь за константа EMPTY?