Rxjs 如何使用Rx.Observable.prototype.let运算符?

Rxjs 如何使用Rx.Observable.prototype.let运算符?,rxjs,rxjs5,Rxjs,Rxjs5,let运算符()的示例和说明不清楚。任何人都有一个很好的例子/解释let操作符是如何工作的,以及我们应该何时使用它?&tldr 它是一个方便的函数,可以划分逻辑并将其注入管道 更详细的解释 这可能是最明确的解释。它实际上只是传递一个函数,该函数通过一个源可观察的调用 Rx.Observable.prototype.let = function(fn) { return fn(this); } 这样做的好处是,我们可以创建或预先定义一个管道,您希望将其重新用于多个源。考虑Rx,反应性搜索条:

let
运算符()的示例和说明不清楚。任何人都有一个很好的例子/解释
let
操作符是如何工作的,以及我们应该何时使用它?

&tldr

它是一个方便的函数,可以划分逻辑并将其注入管道

更详细的解释

这可能是最明确的解释。它实际上只是传递一个函数,该函数通过一个源
可观察的
调用

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);
上面的内容应该给出如何创建管道的基本结构。如果我们想尝试抽象一些逻辑来清理代码或在其他地方使用它,这可能有点棘手,因为这通常意味着创建一个新的操作符(这也有它自己的麻烦)

解决方案是一种相对简单的方法,将公共逻辑拉入一个函数,该函数可以传递一个源
可观察
,并将返回一个新的
可观察
,同时应用该逻辑

因此,上述情况可能会变成:

//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
is to
select
as
switchMap
is to
map
。然而,
select
map
,那么
let
switchMap
有何不同呢?@JohnChristopherJones并不真的。例如,
select
map
是相同的函数,只是彼此的别名
let
是关于干净地创建关注点分离,允许您基于某个抽象的
源定义管道,然后将其插入具体的源。谢谢。我在[github.com/ngrx/example app]的选择器模式示例中看到了
select
let
这两个选项,但我并没有完全理解它们。因此,在jQuery术语中,
let
实际上是方法链调用,允许您参数化方法链的各个部分。或者,要将其与
switchMap
进行比较,您传递的函数必须同时返回可观察值,但
switchMap
接收流成员,并且
let
接收流本身。正确。实际上,我可能说错了,我没有意识到您使用的是
ngrx
,我相信
select
ngrx
存储相关的内容与您感兴趣的键有关。RxJS 4使用了
select
->
map
别名,因为它与微软在DotNet中的命名有关。这确实是一个很好的例子