我有以下流: 然而,当我调试SomeResponseObject我只看到流1的结果(STREAM2的失踪结果) 通过单元测试执行它: stream2是这样创建的: 将这两个列表串联在一起会丢失什么? ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
想象一下,我有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' })
}
我想以一个与此等效的Observable结尾:
Observable.from([{ name: 'Larry' }, Mood.HAPPY, { type: 'fish' }])
我希望按顺序调用这些函数(显然是从参数签名中调用)
我可以使它与这样的事情一起工作:
function perform() {
return getCat().pipe(
mergeMap((cat) => concat(
of(cat),
petCat(cat).pipe(
mergeMap((mood) => concat(
of(mood),
getFood(cat, mood)
))
)
)
),
)
}
问题是 ,是否有更好的,更易读的方法(例如,我想将其中5个链接)?
您可以尝试类似
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}))))
)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.