请教一个 rxjs 的问题,基于 A 请求响应的数据再发出 B,C,D 三个请求(这三个相互之间无依赖),在 B,C,D 都完成后再做一些事情。

2022-01-21 13:05:42 +08:00
 Newyorkcity
请问 这里 A.pipe( operator1(B,C,D), operator2(//do something)) 的 operator1 和 operator2 应该用?

谢谢
1002 次点击
所在节点    问与答
8 条回复
NoDocCat
2022-01-21 14:52:05 +08:00
拆成两个部分考虑:
第一个是 BCD 合并成一个, 很明显是 forkJoin.
第二个是 A -> BCD, 很明显是 mergeMap
Newyorkcity
2022-01-21 17:50:45 +08:00
@NoDocCat 第一个的 forkJoin 无法用在 pipe 里。。如果加一层 mergeMap 的话,第二个操作符又无法区分自己拿到的数据是 B 还是 C 还是 D 响应的。。
Zhuzhuchenyan
2022-01-21 19:49:02 +08:00
一楼说的或许是这种
A.pipe(mergeMap(valueA => forkJoin([B, C, D]))).subscribe(([valueOfB, valueOfC, valueOfD]) => {});
dengshen
2022-03-15 19:04:11 +08:00
问一下楼主。在 rxjs 中一般函数是用 last ValueFrom 返回 promise 还是直接用 rx 对象?
Newyorkcity
2022-03-15 19:25:23 +08:00
@dengshen 我建议是返回 Observable 对象,如果对数据的操作是公有的,则在 pipe 里用 rx 操作符处理。
dengshen
2022-03-15 22:51:18 +08:00
@Newyorkcity #5
请问一下, 在 pipe 中发送一个请求后, 在后续的 pipe 中拿不到数据, 这种情况要怎么处理呢?
```
a.pipe(
map(res => res.data),
map(data => {
if(data.id){
return ajax()
}else{
return data
}
}),
)
.pipe(
map(result => {
console.log(result) // undefine
})
)
```
Newyorkcity
2022-03-16 18:20:07 +08:00
@dengshen

return ajax() 相当于另一个 Observable 替换掉了当前的这个吗?可以去学习一下 switchMap 这个操作符,或许能解决你的问题。

https://rxjs.dev/api/operators/switchMap
dengshen
2022-03-17 00:06:35 +08:00
@Newyorkcity 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829669

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX