2016-07-12 1 views

ответ

39

&tldr;

Это удобная функция для возможности полочкам логики и ввести его в трубопровод.

Longer Объяснение

source, вероятно, наиболее окончательное объяснение. Это просто передача функции, вызываемой с источником Observable.

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

Полезность этого является то, что мы можем создать или предварительно определить трубопровод, который вы хотите повторно использовать для нескольких источников. Рассмотрю общий троп для Rx, реактивной панели поиска:

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

Это звучит как 'let' является' select' как 'switchMap' является' map'. Тем не менее, 'select' является' map', так как 'let' отличается от' switchMap'? –

+3

@JohnChristopherJones не очень. Во-первых, 'select' и' map' - это одна и та же функция, просто псевдонимы друг друга. 'let' заключается в том, чтобы создать разделение проблем чисто, разрешив вам определить конвейер на основе некоторого абстрактного« источника », а затем подключить его к конкретному источнику. – paulpdaniels

+1

Спасибо. Я видел как 'select' и' let', используемые в примерах селекторного паттерна в [github.com/ngrx/example-app], так и не совсем обертывая его вокруг себя. Таким образом, в терминах jQuery 'let' буквально является вызовом цепочки методов, позволяя вам параметризовать разделы цепей методов. Или, чтобы сравнить его с 'switchMap', функции, которые вы передаете, должны возвращать Observables, но' switchMap' принимает члены потока и 'let' принимает сам поток. –

 Смежные вопросы

  • Нет связанных вопросов^_^