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')
})

这样,用户可以收到验证码并成功验证的概率大大增长。

剧终

相关文章
相关标签/搜索