我有一个场景,我需要向端点发出请求,然后根据返回值,我需要产生多个项目或只是传递一个项目(特别是我正在使用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);
});
答案 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;
})
我正在使用concat
在source
可观察完成后附加一个值。顺便说一句,在将来的RxJS版本中,将有endWith
运算符,它将使其更加明显。 https://github.com/ReactiveX/rxjs/pull/3679