根据项目值有条件地产生多个值并合并到原始流中

Conditionally producing multiple values based on item value and merging it into the original stream

我有一个场景,我需要向端点发出请求,然后基于 return 我需要生成多个项目或只传递一个项目(具体来说,我正在使用 redux-可观察并尝试根据 api return 产生多个动作(如果重要)。

我在下面有一个简化的示例,但感觉不像是惯用的 rx,而且感觉很奇怪。在示例中,如果值为偶数,我想生成两个项目,但如果为奇数,则只需传递该值即可。 "right" 实现此目的的方法是什么?

    test('url and response can be flatMap-ed into multiple objects based on array response and their values', async () => {
  const fakeUrl = 'url';
  axios.request.mockImplementationOnce(() => Promise.resolve({ data: [0, 1, 2] }));

  const operation$ = of(fakeUrl).pipe(
    mergeMap(url => request(url)),
    mergeMap(resp => resp.data),
    mergeMap(i =>
      merge(
        of(i).pipe(map(num => `number was ${num}`)),
        of(i).pipe(
          filter(num => num % 2 === 0),
          map(() => `number was even`)
        )
      )
    )
  );

  const result = await operation$.pipe(toArray()).toPromise();

  expect(result).toHaveLength(5);
  expect(axios.request).toHaveBeenCalledTimes(1);
});

尝试使用这样的组合——分区+合并。 这是一个例子(只是一个草稿)

const target$ = Observable.of('single value');
const [streamOne$, streamTwo$] = target$.partition((v) => v === 'single value');
// some actions with your streams - mapping/filtering etc.
const result$ = Observable.merge(streamOne$, streamTwo$)';

就我个人而言,我会以非常相似的方式进行操作。您只是不需要在这两种情况下都使用内部 merge

...
mergeMap(i => {
  const source = of(`number was ${i}`);
  return i % 2 === 0 ? merge(source, of(`number was even`)) : source;
})

我正在使用 concatsource Observable 完成后附加一个值。顺便说一句,在未来的 RxJS 版本中会有 endWith 运算符,这将使它更加明显。 https://github.com/ReactiveX/rxjs/pull/3679