Пример и пояснение оператора let
(https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/let.md) не ясны. У кого-нибудь есть хороший пример/объяснение, как работает оператор let
, и когда мы должны его использовать?Как использовать оператор Rx.Observable.prototype.let?
ответ
&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);
Это звучит как 'let' является' select' как 'switchMap' является' map'. Тем не менее, 'select' является' map', так как 'let' отличается от' switchMap'? –
@JohnChristopherJones не очень. Во-первых, 'select' и' map' - это одна и та же функция, просто псевдонимы друг друга. 'let' заключается в том, чтобы создать разделение проблем чисто, разрешив вам определить конвейер на основе некоторого абстрактного« источника », а затем подключить его к конкретному источнику. – paulpdaniels
Спасибо. Я видел как 'select' и' let', используемые в примерах селекторного паттерна в [github.com/ngrx/example-app], так и не совсем обертывая его вокруг себя. Таким образом, в терминах jQuery 'let' буквально является вызовом цепочки методов, позволяя вам параметризовать разделы цепей методов. Или, чтобы сравнить его с 'switchMap', функции, которые вы передаете, должны возвращать Observables, но' switchMap' принимает члены потока и 'let' принимает сам поток. –