2016-07-12 5 views

答えて

39

&tldr;

これはロジックを区分し、パイプラインに注入することができるための便利な機能です。

長い説明

sourceは、おそらく最も決定的な説明です。実際には、ソースObservableで呼び出される関数を渡すだけです。

Rx.Observable.prototype.let = function(fn) { 
    return fn(this); 
} 

このユーティリティは、複数のソースに対して再利用するパイプラインを作成または事前定義できるということです。

// Listen to a key up event on the search bar 
// and emit the value of the search 
Rx.Observable.fromEvent(searchBar, 'keyup', e => e.target.value) 
    // Don't search too eagerly 
    .filter(text => text.length > 3) 
    .debounceTime(500) 
    //Search logic 
    .flatMap(text => $.getJSON(`my/search/api?q=${text}`)) 
    .flatMap({results} => results) 
    //Handler 
    .subscribe(appendToList); 

上記の説明は、パイプラインの作成方法の基本的な意味を示すはずです。このロジックのいくつかを抽象化してコードをクリーンアップするか、別の場所で使用できるようにする場合は、通常は新しい演算子を作成することを意味するため、ちょっと難しいかもしれません。

解決策は、一般的なロジックをソースObservableに渡すことができる関数にプルする比較的単純なアプローチであり、そのロジックが適用された新しいObservableを返します。

したがって、上記のなる可能性があります:

//Defined in pipelines.js 
function filterBuilder(minText, debounceTime) { 
    return (source) => 
    source.filter(text => text.length > minText) 
      .debounce(debounceTime); 
} 

function queryBuilder(baseUrl) { 
    return (source) => 
    source.flatMap(text => $.getJSON(`${baseUrl}?q=${text}`)) 
      .flatMap({results} => results); 
} 


//In your application code 

Rx.Observable.fromEvent(searchBar, 'keyup', e => e.target.value) 
    .let(filterBuilder(3, 500)) 
    .let(queryBuilder('my/search/api')) 
    .subscribe(appendResults); 
+1

switchMap'がmap' 'にある'としてlet'がSELECT' 'にある'ように聞こえます。しかし、 'select'は' map'ですから、 'let'と' switchMap'とはどう違うのですか? –

+3

@JohnChristopherJonesは本当にありません。 1つは、 'select'と' map'はお互いのエイリアスと同じ関数です。 'let'は、ある抽象的な' source'に基づいてパイプラインを定義し、それを具体的なソースに差し込むことを可能にすることによって、懸念をきれいに分離することです。 – paulpdaniels

+1

ありがとうございます。私は、[github.com/ngrx/example-app]のセレクタパターンの例で 'select'と' let'の両方を見てきました。したがって、jQueryの用語では、 'let'は文字通りメソッド連鎖呼び出しであり、メソッドチェーンのセクションをパラメータ化できます。あるいは、 'switchMap'と比較するために渡す関数はObservablesを返さなければなりませんが、' switchMap'はストリームメンバーを受け取り、 'let'はストリーム自体を受け取ります。 –

関連する問題