Concat 列表和可观察列表

Concat list and observable list

假设我有 3 个列表。其中两个是基本列表,而最后一个是可观察列表。

问题是我现在想将不可观察列表合并到可观察列表中。
现在我做了这样的事情,但我觉得它“违背了可观察性的本质”

listToMerge = []
listObs$: BehaviorSubject<[]> = new BehaviorSubject([]);
listObsCopy = []

我已经使用 next 方法在 listObs 中添加了一些元素

listObs$.next(someStuff);
listObsCopy = somestuff;

这是我合并它们的尝试。

listToMerge = listObsCopy.concat(someOtherStuff);
listObs$.next(listToMerge as any);

您可以轻松地从数组创建一个可观察对象,然后使用 from() 函数连接它们:

https://www.learnrxjs.io/learn-rxjs/operators/creation/from

const arraySource = from([1, 2, 3, 4, 5]);
const arraySource2 = from([6, 7, 8]);
arraySource.concat(arraySource2).subscribe()

这是您要找的吗?它将使用 RxJS 将所​​有数组合并为一个数组。

    import { BehaviorSubject, merge } from 'rxjs';
    import { concatAll, take, tap, toArray } from 'rxjs/operators';

    // Subject (and Observable with take(1) to force completion.)
    let listSubject: BehaviorSubject<string[]> = new BehaviorSubject<string[]>(['B1', 'B2']);
    let listObs$ = listSubject.asObservable().pipe(take(1));

    // List to Merge 
    let listToMerge = ['1', '2'];

    let mergedObs$ = merge(listToMerge, listObs$).pipe(concatAll(), toArray());

    mergedObs$.subscribe((value) => console.log('merged array:', value));

https://stackblitz.com/edit/typescript-ukxwep?file=index.ts

诀窍在于使用 concatAll() 运算符来展平所有数组,然后使用 toArray() 运算符从中生成 1 个数组。

请注意,我已将 take(1) 添加到主题的可观察对象中。订阅只会在 Observable 结束时开始。