Сделайте rx js expand lazy - PullRequest
       52

Сделайте rx js expand lazy

0 голосов
/ 17 июня 2020

Я использую 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)
...