【问题标题】:RxJS/Observable flatMap can return Observable or arrayRxJS/Observable flatMap 可以返回 Observable 或数组
【发布时间】:2017-12-28 20:20:17
【问题描述】:

有人可以向我解释为什么.flatMap 运算符可以接受返回Observablearray 的函数吗?

official docs 说:

FlatMap 运算符通过应用函数来转换 Observable 您为源 Observable 发射的每个项目指定的,该函数返回一个本身发射项目的 Observable。

为什么它也能返回一个数组

例如,这些都是有效的:

obs$.flatMap((data) => {
    return [];
});

obs$.flatMap((data) => {
    return new Observable<string>();
});

但这不起作用:

obs$.flatMap((data) => {
    return 1;
});

【问题讨论】:

  • Observables 可以被认为是随时间分布的数组,因此扁平化数组就像扁平化同步的 observable。 1 既不是数组也不是 observable,所以当然不行。
  • flatMapmergeMap 的别名。查看文档,您将看到该函数可以返回可观察的、承诺的或类似数组的值:reactivex.io/rxjs/class/es6/…
  • 具体可以返回一个ObservableInput:reactivex.io/rxjs/class/es6/…
  • 谢谢,这对我的理解很有帮助,没想到是ObservableInput。那么.flatMap 如何返回一个 Observable 数组呢?还是那不可能?
  • 如果你调用 flatMap 在一个 observable 数组上,你会得到一个 observable 的 observable - 称为高阶 observable。有一些算子可以进一步展平这些高阶可观测量。查看mergeAllconcatAll。此外,如果这些链接有助于您理解内容,您可能需要考虑添加 self answer

标签: angular rxjs observable flatmap


【解决方案1】:

官方文档不相关,因为它们指的是 RxJS 4 而不是 RxJS 5。

mergeMap投影函数返回not just Observable but ObservableInput interface,适用于miscellaneous values that can be converted to observables

数组可以解释为可观察对象,从左到右,从左到右一一发出数组中的所有值,然后立即完成。

这意味着

obs$.flatMap((data) => arr)

基本上是一个较短的版本

obs$.flatMap((data) => Observable.from(arr))

【讨论】:

  • 谢谢!这让我更了解它
猜你喜欢
  • 1970-01-01
  • 2020-03-05
  • 2019-08-05
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2019-10-11
  • 2017-06-15
相关资源
最近更新 更多