簡體   English   中英

rxjs運算符僅在所有concat可觀察值都完成時通知我

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM