首页 > 解决方案 > 将两个 Observable 合并为一个相同类型的 Observable

问题描述

我有两个相同类型的 Observable,我想将它们合并为一个 observable 并删除重复项。

到目前为止,我基本上尝试了所有 rxjs 运算符,但没有一个能满足我的需要。见附图:很多 rxjs 操作符改变了结果 observable 的类型。 在此处输入图像描述

const a: Observable<Foo[]> = ...
const b: Observable<Foo[]> = ...

这是我检索一些数据的两个调用。

现在最接近的两个操作:

combineLatest(a, b);

这个创建了一个具有两个索引的新数组,a 的结果将进入索引 0,b 的结果将进入索引 1。我不能这样使用它。

const c = a.pipe(mergeMap(a1 => b.pipe(map(a2 => [...a1, ...a2]))));

这个差一点就明白了。这里的问题如下:假设 a 返回 2 个结果(示例值:1 和 2)并且 b 也返回 2 个结果(示例值:2 和 3)。所以“2”是重复的,它不应该出现在结果 observable 中两次。

有谁知道运算符的组合,以便我可以组合两个可观察对象并删除重复项?

标签: javascriptangular

解决方案


由于您的 observables 是 http 调用,我假设它们在发出后完成。你可以使用 forkJoin 来组合它们:

const combine= forkJoin(a, b).pipe(
    map(([a, b]) => a.concat(b))
);

如果您的 observables 没有完成,请使用 combineLatest:

const combine= combineLatest(a, b).pipe(
    map(([a, b]) => a.concat(b))
);

推荐阅读