想象一下,我有3个函数,带有一些参数并返回一个可观察值。逻辑将是(所有都是异步的结果):
示例代码:
Number()
我想最终得到一个与此等效的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' })
}
我希望依次调用这些函数(显然是通过参数签名)
我可以使它像这样工作:
Observable.from([{ name: 'Larry' }, Mood.HAPPY, { type: 'fish' }])
问题是,是否有更好的,更易读的方式(例如,我想链接其中的5个)?
答案 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}))))
)
}