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

RxJS:扫描操作员内切换地图/合并地图

宋望
2023-03-14

我们正在使用扫描操作符来执行表中的“加载更多”按钮。使用scan操作符,我们只需将新结果与以前的结果相加。然而,我们遇到了一些意想不到的行为。

为了简化,假设我们有以下代码

const fakeRequest = of('response').pipe(delay(2000));
interval(1000).pipe(
    mergeMap(_ => fakeRequest),
    scan<string>((allResponses, currentResponse) => [...allResponses, currentResponse], []),
).subscribe(console.log);

生产:

["response"]
["response", "response"]
["response", "response", "response"]
["response", "response", "response", "response"]
...

而如果我们只是将扫描操作符移动到mergeMap/switchMap操作符中:

interval(1000).pipe(
    mergeMap(_ => fakeRequest.pipe(
        scan<string>((allResponses, currentResponse) => [...allResponses, currentResponse], []),
    )),
).subscribe(console.log);

我们得到以下结果:

["response"]
["response"]
["response"]
["response"]
...

在第二个示例中,未执行扫描运算符。我希望switchMap/mergeMap只是将内部的可观察对象展平,扫描操作符通过管道插入其中。

  • 这是期望的行为吗?
  • 如果是这样,有人能解释为什么会这样吗?
  • 如果是这样,是否有其他方法/工作方法在mergeMap或SwitchMap运算符中实现相同的行为?

谢谢

共有1个答案

彭星津
2023-03-14

产生差异的原因是,在第一种情况下:

interval(1000).pipe(
    mergeMap(_ => fakeRequest),
    scan<string>((allResponses, currentResponse) => [...allResponses, currentResponse], []),
)

您正在扫描mergeMap中创建的所有可见光的发射。

然而,在第二种情况下:

interval(1000).pipe(
    mergeMap(_ => fakeRequest.pipe(
        scan<string>((allResponses, currentResponse) => [...allResponses, currentResponse], []),
    )),
)

你正在扫描一个只发射一次的可观测物体的发射!

本质上,mergeMap()是一个多次发射的源。fakeResponseobservable是一个只发射一次的源。

我从您的评论中看到,您希望在响应下移动扫描的原因是希望在您的服务中执行扫描,因此个人消费者不需要这样做。我知道这是一个老问题,所以也许你现在已经解决了这个问题,但是你当然可以在你的服务中执行扫描逻辑(只要你的间隔()也在那里),方法是在一个上添加。管道(扫描(...))

 类似资料:
  •        为了方便用户更快捷的操作,LSV有很多方便的快捷操作,主要是鼠标操作和快捷键操作。 鼠标操作: 点击鼠标左键拖拽可以拖动底图。 按下滚轮或右键拖拽鼠标,可以调整三维视角。 右击鼠标可以执行一系列包括复制坐标、测量地表距离、全屏显示、绕中心飞行、设置起点以及设置终点的操作。 快捷键操作: 地图区: Alt+1:绘制点 Alt+2:绘制线 Alt+3:绘制面 Alt+4:选择对象 WAS

  •        为了方便用户更快捷的操作,LSV有很多方便的快捷操作,主要是鼠标操作和快捷键操作。 鼠标操作: 点击鼠标左键拖拽可以拖动底图。 按下滚轮或右键拖拽鼠标,可以调整三维视角。 右击鼠标可以执行一系列包括复制坐标、测量地表距离、全屏显示、绕中心飞行、设置起点以及设置终点的操作。 快捷键操作: 地图区: Alt+1:绘制点 Alt+2:绘制线 Alt+3:绘制面 Alt+4:选择对象 WAS

  • 问题内容: 我有两个键为s且值为的映射。给定两个s,合并它们的最简单方法是什么,如果两个键相同,则值是两个集合的并集。您可以假设值永远不会为null,并且如果有用的话,我们可以将它们设为s。 问题答案: 我们在谈论实例。在这种情况下,查找值为O(1),因此您只需获取一个映射,然后对该映射的条目进行迭代,看看另一个映射是否包含该键。如果没有,只需添加设置。如果包含密钥,则将两个集合并集(通过将一个集

  • 本文向大家介绍arcgis android之地图图层切换,包括了arcgis android之地图图层切换的使用技巧和注意事项,需要的朋友参考一下 图层切换是arcgis for android 开发必常见的功能,我的实现方法很简单。 首先初始化多个图层服务对象,如下: 在onCreate()方法里创建一个默认图层: 最后当点击相应的图层按钮时做判断即可: 好了,今天就写到这里,以后我再介绍其他a

  • ​ ​ 在地图主界面找到工具箱,打开工具箱,工具箱底部有切换地图的选项,目前支持三种地图分别为普通地图、黑夜地图、卫星地图,如上图所示。

  • 问题内容: 我想将两个Map与JAVA 8 Stream合并: 我尝试使用此实现: 但是,此实现只会产生如下结果: 如果中没有包含一个键,则会将其作为新键添加到相应的String列表中。如果键在和中重复,则两个值列表将被合并为:,然后是。 问题答案: 您可以通过遍历中的所有条目并将它们合并到中来实现此目的。 下面通过调用操作消耗每个条目的键和值的位置来遍历的条目。对于每个条目,我们叫上:这将要么创