[Rx.Observable.case(selector, sources, [elseSource|scheduler])
]javascript
選擇序列中特定可觀察對象進行訂閱,在特定可觀察對象不存在的狀況下,返回傳入的默承認觀察對象。php
selector
(Function
): 返回鍵的字符串的函數,鍵用以與sources
中的鍵名進行比較。java
sources
(Object
): 一個包含可觀察對象的Javascript對象。mysql
[elseSource|scheduler]
(Observable
| Scheduler
):當selector
沒法匹配sources
時,該對象被默認返回。 若是沒有明確指定,將返回附加了指定scheduler
的Rx.Observabe.empty
對象。sql
(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){ // 驗證用戶郵箱是否重複 })
劇終