将数组的 observable 转换为 observable 的数组

问题描述

我正在尝试从数组的 observable 进行转换:

of([1,2,3]);

进入一个可观察的数组:

[ of(1),of(2),of(3) ]

但我没有想法。我尝试了以下方法

of([1,3]).pipe(map((elements: number[]) => elements.map(element => of(element)))

但这给了我这样的东西,有一个我不想要的外部可观察对象。

of([ of(1),of(3) ])

因为我想将结果与其他数组连接起来,所以我只订阅外部 observable 来获取数组并不方便……我想我需要一个相反的 concatAll 运算符。有什么想法吗?

解决方法

如果你知道 observable 总是完全同步的 (但请记住,这并不是您可以在运行时检查的内容),您 可以这样做:

const extractValue = <T>(source$: Observable<T[]>): Observable<T>[] => {
  let result: Observable<T>[];
  source$
    .pipe(
      map((arr) => arr.map((value) => of(value))),take(1)
    )
    .subscribe((_result) => {
      result = _result;
    });
  return result;
};

否则,您必须使用异步函数:

const extractValue = <T>(
  source$: Observable<T[]>
): Promise<Observable<T>[]> => {
  return source$
    .pipe(
      map((arr) => arr.map((value) => of(value))),take(1)
    )
    .toPromise();
};
,

RxJS#from

from([1,2,3,4,5]).subscribe(console.log) // 1 2 3 4 5

或作为可管道操作符

of([1,5]).pipe(
  concatMap(v => from(v))
).subscribe(console.log) // 1 2 3 4 5

将其与您的转换相结合

of([1,5]).pipe(
  map((elements: number[]) => 
    elements.map(element => of(element))
  ),concatMap(x => from(x))
)

结合

of([1,5]).pipe(
  concatMap((elements: number[]) => 
    from(elements.map(element => of(element)))
  )
)
,

也许您可以尝试从数组创建一个 Observable,然后使用 of() 函数将每个成员转换为 Observable:

const arr = [1,3];

from(arr).pipe(
  mergeMap((a) => of(a))
);

之后,您可以随意处理每个 observable。