Я использую expand для рекурсивной выборки какого-либо источника, и я хочу передать результат в другое место. Но я также хочу, чтобы получатель мог ожидать чего-то еще до того, как будет выполнена следующая выборка.
В приведенном ниже примере я знаю, что смогу сделать это в операции расширения: return from(fetch(i)).then(shouldWaitForMe)
но в идеале я бы хотел этого избежать.
import { EMPTY, defer, from, Observable } from 'rxjs'
import { expand, concatMap } from 'rxjs/operators'
const wait = (n: number) =>
new Promise((resolve, reject) => setTimeout(resolve, n))
const fetch = (i: number) => {
console.log('Fetching')
return wait(1).then(() => i + 1)
}
const shouldWaitForMe = (i: number) => {
console.log('Should wait for me')
return wait(10).then(() => `Did something with ${i}`)
}
const op = (obs: Observable<number>) => obs.pipe(concatMap(shouldWaitForMe))
const $ = defer(() => fetch(0)).pipe(
expand((i) => {
if (i >= 10) {
return EMPTY
}
return from(fetch(i))
})
)
$.pipe(op).subscribe(console.log)