RxJS API剖析(二)

Rx* (Observable.case)要领

要领定义

[Rx.Observable.case(selector, sources, [elseSource|scheduler])]

作用

挑选序列中特定可视察对象举行定阅,在特定可视察对象不存在的情况下,返回传入的默许可视察对象。

参数

  1. selector (Function): 返回的字符串的函数,用以与sources中的键名举行比较。

  2. sources (Object): 一个包括可视察对象的Javascript对象。

  3. [elseSource|scheduler] (Observable | Scheduler):当selector没法婚配sources时,该对象被默许返回。 假如没有明白指定,将返回附加了指定schedulerRx.Observabe.empty 对象。

返回值

(Observable): 返回值为经由挑选后的Observable(可视察对象)。

宝珠图

《RxJS API剖析(二)》

实例

var sources = {
  hello: Rx.Observable.just('clx'),
  world: Rx.Observable.just('wxq') 
};
var subscription = Rx.Observable.case(()=>"hello", sources, Rx.Observable.empty())

subscription.subscribe(function(x) {
  console.log(x)
})

实例中,匿名函数()=>"hello"指定需要在sources中返回的可视察对象的键名为"hello",命令行终究输出"clx",点击进入case()实例

题外话

键值对,能够对值举行定名。经由历程键值对能够组织定名的observable可视察对象。

键值对是Javascript对象的组成部分,键名能够轻易举行查找和比较操纵。

两个典范的运用场景中,数据都是用键值对示意的:经由历程Ajax要求取得的数据,就是一个键值对(JSON'对象);很多设置文件也是键值对写入并耐久化的,比方数据库、缓存的设置。

典范的Ajax要求效果

{
    message: "ok",
    nu: "350430378480",
    companytype: "huitongkuaidi",
    ischeck: "1",
    com: "huitongkuaidi",
    updatetime: "2016-01-15 10:58:19",
    status: "200",
    condition: "F00",
    codenumber: "350430378480"
}

Laravel 的数据库设置

'mysql' => [
    'read' => [
        'host' => '127.0.0.1',
    ],
    'write' => [
        'host' => '127.0.0.1'
    ],
    'driver'    => 'mysql',
    'database'  => 'homestead',
    'username'  => env('DB_USERNAME', 'root'),
    'password'  => env('DB_PASSWORD', ''),
    'charset'   => 'utf8',
    'collation' => 'utf8_general_ci',
    'prefix'    => '',
    'strict'    => false,
]

试想,我们从差别的其他服务器猎取设置文件,那末全部猎取设置的历程是异步的。

我们将猎取的效果封装成可视察对象,再定名为如database如许称号的键值对,运用case()要领便能够在可视察对象发射时,实行响应的初始化操纵。

var config = {
    "database": Observable.return("数据库设置"),
    "cache": Observable.return("缓存设置"),
    "picCDN": Observable.return("图片CDN设置,比方七牛")
};
Observable.case(()=>'database', config, Observable.empty())
    .subscribe((databaseConfig) => {
        // 衔接数据库
    })
Observable.case(()=>'picCDN', config, Observable.empty())
    .subscribe((pciCDNConfig) => {
        // 初始化图片CDN
    })

把上面的例子离开写也没有什么问题:

Observable.return("数据库设置")
    .subscribe(function(databaseConfig) {
        // 链接数据库
    })

Observable.return("图片CDN设置,比方七牛")
    .subscribe(function(picCDNConfig) {
        // 初始化图片CDN
    })

我们为什么要节外生枝去运用case()呢?从构造化去斟酌,将一切从长途猎取设置的历程封装成config对象更有实际意义,也更便于代码的保护和治理。

我们再看一个例子作为完毕:例子是针对表单举行校验,校验用户的手机号邮箱是不是和服务器纪录反复,将一切校验封装在validate对象中构造更加合理:

var validate = {
    "mobile": Observable.return('123-566-789-01'),
    "email": Observable.return('JonSnow@company.com')
};
var emptyObserable = Observable.empty();
validate.case(()=>'mobile', validate, empty)
    .subscribe(function(mobile){
        // 考证手机号码是不是反复
    })
validate.case(()=>'email', validate, empty)
    .subscribe(function(email){
        // 考证用户邮箱是不是反复
    })

剧终

    原文作者:mumuzhenzhen
    原文地址: https://segmentfault.com/a/1190000004313314
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞