Rx* (Observable.case)要领
要领定义
[Rx.Observable.case(selector, sources, [elseSource|scheduler])
]
作用
挑选序列中特定可视察对象举行定阅,在特定可视察对象不存在的情况下,返回传入的默许可视察对象。
参数
selector
(Function
): 返回键的字符串的函数,键用以与sources
中的键名举行比较。sources
(Object
): 一个包括可视察对象的Javascript对象。[elseSource|scheduler]
(Observable
|Scheduler
):当selector
没法婚配sources
时,该对象被默许返回。 假如没有明白指定,将返回附加了指定scheduler
的Rx.Observabe.empty
对象。
返回值
(Observable
): 返回值为经由挑选后的Observable
(可视察对象)。
宝珠图
实例
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){
// 考证用户邮箱是不是反复
})
剧终