繁体   English   中英

康卡特可观察物重用以前的结果

Concat observables reusing the previous results

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

想象一下,我有3个函数,接受一些参数并返回一个可观察值。 逻辑将是(所有都是异步的结果):

  1. 养猫
  2. 宠猫。
  3. 抚摸猫后,根据猫的心情为猫吃食物。

样例代码:

function getCat(): Observable<Cat> {
  return Observable.of({ name: 'Larry' }) 
}

function petCat(cat: Cat): Observable<Mood> {
  return Observable.of(Mood.HAPPY)
}

function getFood(cat: Cat, mood: Mood): Observable<Food> {
  return Observable.of({ type: 'fish' })
}
  1. 我想以一个与此等效的Observable结尾:

    Observable.from([{ name: 'Larry' }, Mood.HAPPY, { type: 'fish' }])

  2. 我希望按顺序调用这些函数(显然是从参数签名中调用)

  3. 我不想延迟个人发出的信号,在最后的观察中,我想尽快获得结果。

我可以使它与这样的事情一起工作:

function perform() {
  return getCat().pipe(
    mergeMap((cat) => concat(
        of(cat),
        petCat(cat).pipe(
          mergeMap((mood) => concat(
            of(mood),
            getFood(cat, mood)
          ))
        )
      )
    ),
  )
}

问题是 ,是否有更好的,更易读的方法(例如,我想将其中5个链接)?

1 个回复

您可以尝试类似

getCat()
.pipe(
   switchMap(cat => petCat(cat).pipe(map(mood => ({cat, mood})))),
   switchMap(({cat, mood}) => getFood(cat, mood))
)

整个想法是使用switchMap从源Observable 切换到作为参数传递给switchMap的函数返回的Observable。

也许值得一提的是使用map链接到第一个switchMap的管道中。 map运算符可确保我们将cat作为参数的一部分传递给第二个也是最后一个switchMap

注释后更新如果函数perform必须发出3个函数发出的所有3个元素,那么您可以尝试以下操作

function perform() {
   return getCat()
          .pipe(
             switchMap(cat => petCat(cat).pipe(map(mood => ({cat, mood})))),
             switchMap(({cat, mood}) => getFood(cat, mood).pipe(map(food => ({cat, mood, food}))))
          )
}
3 在 Angular 中重用 observables 服务

我有一个用于在组件和模块之间进行通信的服务。 假设我从Component 1发送一个字符串 这是在Component 2收到的 上面的代码工作正常,但是当我尝试重用时, component 3的代码,组件 2 也收到相同的数据。 在边框图片中,如果我使用不同的数据类型,将不同属性的接口说 ...

4 结合不同类型的可观察物

我想使用SQLBrite将不同的可观察对象连接起来以创建活动流,以使用SQLBrite将信息持久保存到我的Android sqlite数据库中 此流程必须遵循以下活动顺序: 1-创建一个可观察的负责人,以打开交易实例 2-合并许多可观察变量,每个可观察变量负责将数据插入表中(每 ...

5 Concat可观察到的行为

我在ViewModel中有一个BehaviourSubject,我想将其视为可观察到的可进行操作的对象。 因此,我想从数据库中获取用户列表。 我有一个可以观察到的操作。 我在视图中订阅了BehaviourSubject,然后调用getUsers,但没有结果。 提前致谢。 代码:Vi ...

6 Concat Observables的不同类型

我有一个网络调用,用于验证和接收令牌,第二个使用此令牌请求数据。 我想将它们组合成一个Single&lt;Data&gt; 。 为了做到这一点,我看着concat ,但这似乎只适用于相同类型的Observable 。 使用zip我只能返回第二个Observable的响应,但根据我的理解 ...

7 结合内部Concat观测值

我是RxJS的新手,并且有一个思维障碍。 我的解决方案有效,但我知道这是黑客。 什么是执行以下操作的正确方法? ...

8 RxJS 连接两个 observable

我正在尝试连接两个 Obs1 和 Obs2。 Obs1 发出 5、6、7。 Obs2 发出 1、2、3、4。 我正在连接 -&gt; concat(Obs2, Obs1) 在我的订阅者中期望 1,2,3,4,5,6,7,但只得到 1,2,3,4。 我究竟做错了什么? let O ...

9 RxJS - 连接并合并两个可观察对象

我有两个 Observable 我将其用作具有async管道的 Angular 组件的Input值。 我想将这两个 observable 转换为一个,并将它们的值“合并”在单个对象中。 但是,仅应在availableTags$发出其值后才应获取来自jobs$的值。 那可能吗? 所有这些都 ...

2019-01-10 16:49:44 1 2583   rxjs
10 将多个 observables 连接到一个源

我有很多网络调用,它们发出不同的类型,例如字符串、整数等。 我试图让它们平行。 在官方的 rxjava 文档中,我们可以阅读: 这个例子很简单,因为我们所有的类型都是 Int。 但是如果我们有不同的类型,例如 string、boolean、Int 怎么办? 这个5的每一个电话都是独立的 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM