【问题标题】:rxjs operator informs me only if all concat observables completerxjs 运算符仅在所有 concat observables 完成时才通知我
【发布时间】:2018-01-30 14:31:37
【问题描述】:

假设我有一个 http 调用来放置 /cart api,但由于某种原因,我们的后端没有返回更新的购物车,而是返回“成功”字符串。因此,为了获得更新的购物车,我需要再次获取 /cart 以查看新的购物车。最好的方法是什么?

遵循嵌套订阅工作但效果不佳,因为我不想每个组件都这样做:

http.put('/cart', data).subscribe(()=>{http.get('/cart').subscribe(()=>{/**update local cart*/})})

我尝试了 concat 但它为每个 http 调用发出值

http.put('/cart', data).concat(http.get('/cart')).subscribe(/**update local*/)   

这有一个问题:如果 PUT 成功,但 GET 失败,/**update local*/ 部分仍然被调用。这不是预期的,因为当时我无法更新本地购物车。

我希望只有在前两个 observable 都完成时才调用下一个订阅部分,如果发生错误,请转到错误部分

【问题讨论】:

    标签: angular rxjs observable rxjs5


    【解决方案1】:

    您应该始终尽量避免嵌套 subscribe 调用,因为您无法有效地处理错误状态(除了使 Rx 链非常难以理解之外)。

    http.put('/cart', data)
      .concatMap(() => http.get('/cart'))
      .subscribe(
        cart => { /** update local */ }),
        error => { /** one of the HTTP calls failed */ },
      );
    

    请注意,我使用了concatMap 而不是concat,因为使用concat,您将在concat 订阅它时立即创建HTTP 调用。实际上,concat 运算符仅在其源 Observable 完成后才订阅内部 Observables,因此它也可以正常工作,但我仍然建议使用 concatMap,因为它很明显您只想在前一个 Observable 完成后订阅。

    如果您使用concatMap,它的回调只会在上一个 HTTP 调用发出一个值后被调用(对于http.put,这种情况总是只会发生一次)。

    【讨论】:

      【解决方案2】:
      http.put('/cart', data)
          .switchMap(() => http.get<Cart>('/cart'))
          .subscribe(/**update local*/)   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 2020-09-27
        • 1970-01-01
        • 2019-05-11
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多