微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将数组的 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。