Javascript Concat可观察到重复使用以前的结果

Javascript Concat可观察到重复使用以前的结果,javascript,typescript,rxjs,observable,Javascript,Typescript,Rxjs,Observable,假设我有3个函数,取一些参数并返回一个可观测值。逻辑应该是(所有都是异步的结果): 养只猫 爱抚猫 根据猫抚摸后的情绪为它获取食物 示例代码: function getCat(): Observable<Cat> { return Observable.of({ name: 'Larry' }) } function petCat(cat: Cat): Observable<Mood> { return Observable.of(Mood.HAPPY) }

假设我有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' })
    }
    

    问题是,有没有更好的、更具可读性的方法来实现这一点(假设我有5个这样的链接)?

    您可以尝试以下方法

    getCat()
    .pipe(
       switchMap(cat => petCat(cat).pipe(map(mood => ({cat, mood})))),
       switchMap(({cat, mood}) => getFood(cat, mood))
    )
    
    整个想法是使用
    switchMap
    从源可观察对象切换到传递给
    switchMap
    作为参数的函数返回的可观察对象

    也许值得一提的是使用
    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}))))
              )
    }
    

    嘿@Picci,谢谢你的回答。这个答案的问题是,它只会发出返回的可观察值中的最后一个值。您希望得到什么结果?您建议的模拟函数仅发射1个元素。在实际情况中,您是否期望任何观察值实际发出超过1个值?我指的是最终的
    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}))))
              )
    }