假设我有一个关于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,如果发生错误,请转到错误部分
答案 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*/)