Javascript Concat可观察到重复使用以前的结果
假设我有3个函数,取一些参数并返回一个可观测值。逻辑应该是(所有都是异步的结果):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) }
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}))))
)
}