组合将发出不同数量值的可观察对象

Combining observables that will emit differing number of values

我有 2 个 observable,它们是作为数据库查询结果的流数据,每个发出的数据量是可变的,并且可以与另一个不同。我正在尝试弄清楚如何将它们结合起来,以便我可以使用单个订阅并将发出的值推送到两个不同的数组中,例如

let firstArray = [];
let secondArray = [];

const subscription = zip(firstObservable, secondObservable)
   .subscribe({
      next([first, second]) {
         firstArray.push(first);
         secondArray.push(second);
      },
      error(err) {
         console.log(err);
      },
      complete() {
         console.log(firstArray);
         console.log(secondArray);
      }
   });

这个例子的问题在于,使用 zip 会导致它们只从最短的可观测值中捕获发射值,所以如果 firstObservable 发射 2 个值而 secondObservable 发射 10 个,则两者都完成数组的长度为 2。如果这个问题根本不明确,我深表歉意,我对使用 observables 很陌生,并且正在努力完全掌握它们。任何帮助将不胜感激。

您可以使用 toArray 将所有发出的项目收集到一个数组中,并 forkJoin 等待两个 observable 完成:

import { of, forkJoin } from 'rxjs';
import { toArray } from 'rxjs/operators';

const o1 = of(1,2,3,4,5);
const o2 = of('a', 'b');
forkJoin([
  o1.pipe(toArray()),
  o2.pipe(toArray())
]).subscribe(console.log);

Stackblitz