2016-07-12 9 views

Odpowiedz

39

&tldr;

Jest to funkcja wygoda dla mogąc compartmentalize logiki i wstrzyknąć go do rurociągu.

Longer Wyjaśnienie

source jest prawdopodobnie najbardziej ostateczne wyjaśnienie. Jest to po prostu przekazywanie funkcji, która zostaje wywołana ze źródłem Observable.

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

Dzięki temu możemy utworzyć lub wstępnie zdefiniować potok, który chcemy ponownie wykorzystać dla wielu źródeł. Rozważenie wspólnej trop dla Rx, reaktywnej pasku wyszukiwania:

// 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); 

Powyższe powinno dać elementarne poczucie struktury jak rurociąg może zostać utworzony. Gdybyśmy chcieli wypróbować niektóre z tej logiki, aby oczyścić kod lub móc go użyć w innym miejscu, może to być trochę trudne, ponieważ zwykle oznacza to stworzenie nowego operatora (i to ma swoje własne bóle głowy).

Rozwiązaniem jest stosunkowo proste podejście polegające na przeciągnięciu wspólnej logiki do funkcji, która może zostać przekazana jako źródło Observable i zwróci nową Observable z zastosowaną logiką.

Więc powyższe może stać:

//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

To brzmi jak 'let' jest' 'switchMap' select' jak jest' map'. Jednak 'select' to' map', więc w jaki sposób 'let' różni się od' switchMap'? –

+3

@JohnChristopherJones niezupełnie. Po pierwsze, 'select' i' map' są tymi samymi funkcjami, aliasami nawzajem. 'let' oznacza czysto rozdzielenie obaw, umożliwiając zdefiniowanie potoku na podstawie jakiegoś abstrakcyjnego' źródła ', a następnie podłączenie go do konkretnego źródła. – paulpdaniels

+1

Dzięki. Widziałem zarówno "select" i "let" używane w przykładach wzorca selektora w [github.com/ngrx/example-app] i nie całkiem owijałem się wokół niego. Tak więc, w terminach jQuery, 'let' jest dosłownie metodą wywołania łańcuchowego, pozwalającą parametryzować sekcje łańcuchów metod. Lub, aby porównać go z 'switchMap', funkcje, które przekazujesz, muszą zwracać Observables, ale' switchMap' odbiera elementy stream i 'let' otrzymuje sam strumień. –