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

时间:2018-07-11 13:43:41

标签: rxjs redux-observable

我有一个场景,我需要向端点发出请求,然后根据返回值,我需要产生多个项目或只是传递一个项目(特别是我正在使用redux-observable并尝试产生多个项目如果需要,基于api的操作会返回)。

我在下面有一个简化的示例,但是它不像惯用的rx,只是感觉很奇怪。在示例中,如果值是偶数,我想产生两个项目,但如果是奇数,则将值传递给它。实现这一目标的“正确”方法是什么?

    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);
});

2 个答案:

答案 0 :(得分:1)

尝试使用此类组合-分区+合并。 这是一个例子(只是一个划痕)

cmake -DCMAKE_BUILD_TYPE=Debug

答案 1 :(得分:1)

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

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

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