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