RxJS API解析(二)

Rx* (Observable.case)方法

方法定義

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

做用

選擇序列中特定可觀察對象進行訂閱,在特定可觀察對象不存在的狀況下,返回傳入的默承認觀察對象。php

參數

  1. selector (Function): 返回的字符串的函數,用以與sources中的鍵名進行比較。java

  2. sources (Object): 一個包含可觀察對象的Javascript對象。mysql

  3. [elseSource|scheduler] (Observable | Scheduler):當selector沒法匹配sources時,該對象被默認返回。 若是沒有明確指定,將返回附加了指定schedulerRx.Observabe.empty 對象。sql

返回值

(Observable): 返回值爲通過選擇後的Observable(可觀察對象)。數據庫

寶珠圖

Observable.case

實例

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){
        // 驗證用戶郵箱是否重複
    })

劇終

相關文章
相關標籤/搜索