只有当所有concat observable都完成时,rxjs运算符才会通知我

时间:2018-01-30 14:31:38

标签: angular rxjs observable rxjs5

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

嵌套订阅后工作但不好,因为我不想每个组件都这样做:

plot

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

x = 0:0.1:10
plot(x,func1(x))
hold on
plot(x+10,func2(x))

这有一个问题:如果PUT成功,但GET失败,http.put('/cart', data).subscribe(()=>{http.get('/cart').subscribe(()=>{/**update local cart*/})}) 部分仍然会被调用。这是不可预期的,因为我当时无法更新本地购物车。

我希望只有当前两个observable都完成时才会调用subscribe next section,如果发生错误,请转到错误部分

2 个答案:

答案 0 :(得分:2)

您应该始终尝试避免嵌套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完成后才订阅内部Observable,因此它也可以正常工作但我仍然建议使用concatMap,因为它很明显你只想在之前的Observable已经完成。

如果你使用concatMap,只有在前一个HTTP调用发出一个值(http.put只发生一次)后,才会调用它的回调。

答案 1 :(得分:1)

http.put('/cart', data)
    .switchMap(() => http.get<Cart>('/cart'))
    .subscribe(/**update local*/)