Rxjs 基于项目值有条件地生成多个值并将其合并到原始流中

Rxjs 基于项目值有条件地生成多个值并将其合并到原始流中,rxjs,redux-observable,Rxjs,Redux Observable,我有一个场景,我需要向端点发出请求,然后基于返回,我需要生成多个项或只是传递一个项(具体地说,我使用redux observable,并尝试基于api返回生成多个操作,如果有关系的话) 下面我有一个简化的例子,但感觉不像是惯用的rx,只是感觉很奇怪。在本例中,如果值为偶数,我希望生成两个项目,但如果为奇数,则只需传递值即可。实现这一目标的“正确”方式是什么 test('url and response can be flatMap-ed into multiple objects bas

我有一个场景,我需要向端点发出请求,然后基于返回,我需要生成多个项或只是传递一个项(具体地说,我使用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);
});

尝试使用这样的组合-分区+合并。 下面是一个例子(只是一个划痕)


尝试使用这样的组合-分区+合并。 下面是一个例子(只是一个划痕)


就我个人而言,我也会以类似的方式来做。对于这两种情况,您不需要使用内部
合并

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

我正在使用
concat
source
Observable完成后追加一个值。顺便说一句,在未来的RxJS版本中,将有
endWith
操作符,这将使它更加明显

就我个人而言,我会用非常类似的方式来做。对于这两种情况,您不需要使用内部
合并

...
mergeMap(i => {
  const source = of(`number was ${i}`);
  return i % 2 === 0 ? merge(source, of(`number was even`)) : source;
})
我正在使用
concat
source
Observable完成后追加一个值。顺便说一句,在未来的RxJS版本中,将有
endWith
操作符,这将使它更加明显