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

Tuo*_* Le 15 rxjs rxjs5

let运营商的示例和解释(https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/let.md)尚不清楚.任何人都有一个很好的例子/解释let操作员如何工作,何时应该使用它?

pau*_*els 39

&tldr;

它是一种便利功能,能够划分逻辑并将其注入管道.

更长的解释

可能是最明确的解释.它实际上只是传递一个用源调用的函数Observable.

Rx.Observable.prototype.let = function(fn) {
  return fn(this);
}
Run Code Online (Sandbox Code Playgroud)

这样做的用途是我们可以创建或预定义要为多个源重用的管道.考虑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);
Run Code Online (Sandbox Code Playgroud)

上面应该给出了如何创建管道的基本结构.如果我们想尝试抽象一些逻辑来清理代码或者能够在其他地方使用它,那么它可能有点棘手,因为它通常意味着创建一个新的运算符(并且有其自身的麻烦).

该解决方案是一种相对简单的方法,可以将通用逻辑拉入一个可以传递给源的函数中,并在应用该逻辑时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);
Run Code Online (Sandbox Code Playgroud)

  • @JohnChristopherJones不是真的.例如,`select`和`map`是相同的函数,只是彼此的别名.`let`是关于通过允许您基于一些抽象的`source`定义管道然后将其插入具体源来干净地创建关注点分离. (3认同)