RxJS API解析(三)

Rx* (Observable.catch)方法

方法定義

Rx.Observable.catch(...args)javascript

做用

序列中可觀察對象由於異常而被終止後,繼續訂閱序列中的其餘可觀察對象。java

參數

args (Array | arguments): 可觀察對象序列。react

返回值

(Observable): 可觀察對象序列中可以正確終止,不拋出異常的第一個可觀察對象。數據庫

寶珠圖

catch

實例

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終端進行提取現金等操做後,數據都會被及時同步和備份。當不可抗因素髮生時,數據能夠被儘快的經過備份恢復。一般這些解決方案被稱爲災備處理函數

使用雲服務,例如UcloudRedis服務,能夠在同一個服務上看到兩個不一樣地址訪問地址,文檔描述以下:spa

每一個雲內存存儲實例都會提供兩個IP進行訪問。code

這兩個IP均可以對雲內存存儲實例進行訪問,分佈在不一樣的接入服務上,其做用在於,當其中一個IP沒法正常訪問時,仍有另外一個IP可用,不會徹底停止服務。對象

所以,應用程序能夠增長一個容災切換的邏輯處理:將訪問的IP列表設置好,默認訪問其中的一個IP,當該IP沒法訪問時,自動切換到另外一個IP繼續業務。blog

文檔中提到了加強服務可用性的線索:老是提供一組相同的服務而不是一個服務,或者至少是類似的服務,服務調用後能夠完成相同的業務邏輯。
這個策略也是負載均衡的基礎,能夠緩解單個服務提供者的壓力,從用戶角度看,又感知不到服務的差別性:好比 多個HTTP服務 、_讀寫分離的數據庫_。

文末,舉一個實例:假設你須要作一個APP,APP中用戶在經過手機驗證碼驗證後,才能登陸帳戶。

verifyMobile

許多第三方服務提供商,都提供手機驗證服務,好比_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')
})

這樣,用戶可以收到驗證碼併成功驗證的概率大大增長。

劇終

相關文章
相關標籤/搜索