当前位置: 首页 > 知识库问答 >
问题:

RxJS返回来自mergeMap的值数组

滑弘扬
2023-03-14

我有一条可以观察到的溪流。第一个运算符是一个mergeMap,它返回一个可观察的数组。然后,我必须有第二个mergeMap从第一个mergeMap的返回中获取最终值。我觉得这第二个合并映射应该是不必要的,但找不到绕过它的方法。

例子:

source$.pipe(
  mergeMap(() => [of(1), of(2), of(3)]),
  mergeMap((val) => val)
)

这最终是我所拥有的。第二个mergeMap只存在于订阅第一个的输出。没有它,我的输出是可观察的(即(1)的而不是实际值1)。有没有办法实现第二次合并映射?


共有2个答案

公孙威
2023-03-14

原因是第一个mergeMap应用于数组,不管是什么数组。

换句话说

source$.pipe(
  mergeMap(() => ['a', 'b', 'c']),
)

发出第一个a然后b然后c然后完成。

因此,在您的情况下,您需要第二个mergeMap来平坦发出的可观测数据。

作为一种替代方法,如果对您的情况有意义,您可以使用forkJoin而不是mergeMap。像这样的

source$.pipe(
  forkJoin([of(1), of(2), of(3)]),
)
.subscribe(console.log) // '1' '2' '3'
左恺
2023-03-14

您可以在mergeMap操作符中使用merge函数,将观察值数组中的所有观察值合并为一个单独的观察值,该观察值将在任何基础观察值发出时发出。

这方面的代码片段如下:

source$.pipe(
  mergeMap(() => merge(...[of(1), of(2), of(3)])),
)
 类似资料:
  • 我正在学习使用RXJS。在这个场景中,我使用rxjs链接了一些异步请求。在上一次合并地图时,我希望能够访问第一个合并地图的参数。我已经探索了使用或的选项,但这两个选项似乎都不适合这里。 是一个异步请求,它返回一个可观察到的从远程服务器读取CSV。 是另一个异步请求,它返回一个可观察的字符串,以将转换为 只进行转置 是异步DB请求,需要。 我怎么才能得到那个?接受一些关于为什么我这样做不好的建议会很

  • 有人,请解释一下SwitchMap和FlatMap在Javascript方面的区别(在角度透视图中,rxjs 5) 以我的理解。 SwitchMap仅发出最新的可观察值,并取消先前的可观察值。 flatMap收集所有单独的可观测数据,并在单个数组中返回所有可观测数据,而不关心可观测数据的顺序。异步工作。 concatMap保持秩序并发出所有可观察值,同步工作 是这样吗? mergeMap与上面的工

  • 我想这样做: js中是否有一种方法可以调用同步代码中的函数,并仅在我的controlVar变为1时返回值? 这不应该阻止,因为当我使用setTimeout时,主循环应该能够控制,但是如果阻止对我来说并不重要。 谢谢

  • 我们有一个执行http请求的请求服务。所有请求都实现IRequest接口,该接口包含http方法和一个执行函数,该函数依次返回另一个可观察的对象。 RequestService有一个重载,它接受一个源可观察对象,还有一个requestfactory,它根据源可观察对象的值返回一个IRequest实例。 当然,在服务中做了更多的工作(日志记录、默认错误处理,...),但大多数与问题无关。 现在,这一

  • 当我使用Angular HttpClient发出GET请求时,我得到一个可观察的返回,并在RxJS操作符mergeMap中处理它。 现在一次又一次地抛出404,我想抓住它。最后,浏览器控制台中不应出现错误消息,并且应使用流的下一个值处理管道。 这有可能吗?我没有用catchError()管理它。 以下是我的代码的简化版本: 更新:添加了带有catchError()的方法 我尝试过这种方式,但没有检

  • 我知道显示输出的其他方式。但我想知道是否可以直接检索返回数组的元素。