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

时间:2018-11-14 17:29:16

标签: javascript typescript rxjs observable

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

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

示例代码:

Number()
  1. 我想最终得到一个与此等效的Observable:

    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' }) }

  2. 我希望依次调用这些函数(显然是通过参数签名)

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

我可以使它像这样工作:

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

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

1 个答案:

答案 0 :(得分: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}))))
          )
}