V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2022-01-21 13:05:42 +08:00 · 1027 次点击
    这是一个创建于 1065 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问 这里 A.pipe( operator1(B,C,D), operator2(//do something)) 的 operator1 和 operator2 应该用?

    谢谢
    8 条回复    2022-03-17 00:06:35 +08:00
    NoDocCat
        1
    NoDocCat  
       2022-01-21 14:52:05 +08:00   ❤️ 1
    拆成两个部分考虑:
    第一个是 BCD 合并成一个, 很明显是 forkJoin.
    第二个是 A -> BCD, 很明显是 mergeMap
    Newyorkcity
        2
    Newyorkcity  
    OP
       2022-01-21 17:50:45 +08:00
    @NoDocCat 第一个的 forkJoin 无法用在 pipe 里。。如果加一层 mergeMap 的话,第二个操作符又无法区分自己拿到的数据是 B 还是 C 还是 D 响应的。。
    Zhuzhuchenyan
        3
    Zhuzhuchenyan  
       2022-01-21 19:49:02 +08:00   ❤️ 1
    一楼说的或许是这种
    A.pipe(mergeMap(valueA => forkJoin([B, C, D]))).subscribe(([valueOfB, valueOfC, valueOfD]) => {});
    dengshen
        4
    dengshen  
       2022-03-15 19:04:11 +08:00 via iPhone
    问一下楼主。在 rxjs 中一般函数是用 last ValueFrom 返回 promise 还是直接用 rx 对象?
    Newyorkcity
        5
    Newyorkcity  
    OP
       2022-03-15 19:25:23 +08:00
    @dengshen 我建议是返回 Observable 对象,如果对数据的操作是公有的,则在 pipe 里用 rx 操作符处理。
    dengshen
        6
    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
        7
    Newyorkcity  
    OP
       2022-03-16 18:20:07 +08:00
    @dengshen

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

    https://rxjs.dev/api/operators/switchMap
    dengshen
        8
    dengshen  
       2022-03-17 00:06:35 +08:00 via iPhone
    @Newyorkcity 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:01 · PVG 13:01 · LAX 21:01 · JFK 00:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.