[英]rxjs operator informs me only if all concat observables complete
假設我有一個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*/
部分。 這是無法預期的,因為那時我無法更新本地購物車。
我希望僅在前兩個可觀察到的操作都完成時才調用下一個訂閱部分,如果發生錯誤,請轉到錯誤部分
您應該始終避免嵌套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
總是僅發生一次)。
http.put('/cart', data)
.switchMap(() => http.get<Cart>('/cart'))
.subscribe(/**update local*/)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.