Rx.Observable.catch(...args)
javascript
序列中可觀察對象由於異常而被終止後,繼續訂閱序列中的其餘可觀察對象。java
args
(Array
| arguments
): 可觀察對象序列。react
(Observable
): 可觀察對象序列中可以正確終止,不拋出異常的第一個可觀察對象。數據庫
var obs1 = Rx.Observable.throw(new Error('error')); var obs2 = Rx.Observable.return(42); var source = Rx.Observable.catch(obs1, obs2); var subscription = source.subscribe( x => console.log(`onNext: ${x}`), e => console.log(`onError: ${e}`), () => console.log('onCompleted')); // onNext: 42
在訂閱時, obs1
拋出錯誤後,程序繼續執行,轉而輸出沒有異常的obs2
,並輸出obs2
發射的值42
。點擊進入在線演示。負載均衡
服務可用性是指,服務提供者須要保證服務在任什麼時候間、狀況下正確地提供。好比聯網的銀行系統,用戶在各個ATM終端進行提取現金等操做後,數據都會被及時同步和備份。當不可抗因素髮生時,數據能夠被儘快的經過備份恢復。一般這些解決方案被稱爲災備處理。函數
使用雲服務,例如Ucloud的Redis
服務,能夠在同一個服務上看到兩個不一樣地址訪問地址,文檔描述以下:spa
每一個雲內存存儲實例都會提供兩個IP進行訪問。code
這兩個IP均可以對雲內存存儲實例進行訪問,分佈在不一樣的接入服務上,其做用在於,當其中一個IP沒法正常訪問時,仍有另外一個IP可用,不會徹底停止服務。對象
所以,應用程序能夠增長一個容災切換的邏輯處理:將訪問的IP列表設置好,默認訪問其中的一個IP,當該IP沒法訪問時,自動切換到另外一個IP繼續業務。blog
文檔中提到了加強服務可用性的線索:老是提供一組相同的服務而不是一個服務,或者至少是類似的服務,服務調用後能夠完成相同的業務邏輯。
這個策略也是負載均衡的基礎,能夠緩解單個服務提供者的壓力,從用戶角度看,又感知不到服務的差別性:好比 多個HTTP服務 、_讀寫分離的數據庫_。
文末,舉一個實例:假設你須要作一個APP,APP中用戶在經過手機驗證碼驗證後,才能登陸帳戶。
許多第三方服務提供商,都提供手機驗證服務,好比_LeanCloud_,調用者像服務提供方發送POST
請求,請求的body
爲用戶手機號碼。而後服務提供者,會將驗證碼發送到用戶手機。用戶在收到驗證碼後,經過表單,輸入驗證碼,提交後,調用者再次向服務提供商發起POST
請求,請求的body
爲用戶輸入的驗證碼而後等待服務提供商響應。
固然,某些狀況下,服務提供商可能本身掛了,或者是不支持向某個號碼所屬的運營商提供服務;還有些狀況下,用戶的號碼可能在某個服務提供商的黑名單中。好比:你的一個用戶是 常常寫競品分析的產品經理 ,可能也許大概你的號碼就在某個服務提供商的黑名單中。
咱們每每要同時接入多個服務提供商的短信驗證服務,保證用戶可以正常經過咱們的註冊(登陸)流程:
回到catch()
函數,結合定義咱們能夠把一個提供商做爲主要服務提供者,若是其不能提供服務(調用失敗),咱們能夠選擇第二家做爲候選:
var service1 = Observable.create("服務提供商#1"); var service2 = Observable.create("服務提供商#1"); Observable.catch(service1, service2).subscribe({ ()=>console.log('succeed'), ()=>console.log('全部驗證服務均不可用') ()=>console.log('completed') })
這樣,用戶可以收到驗證碼併成功驗證的概率大大增長。
劇終