RxJS官方教程(一) 概览

  • RxJS官方教程(一) 概览
  • RxJS官方教程(二) Observable
  • RxJS官方教程(三) Observable剖析
  • RxJS官方教程(四) Observer和Subscription
  • RxJS官方教程(五) Subject
  • RxJS官方教程(六) 算子

介绍

RxJS是一个使用可观察序列组成异步和基于事件的程序的库。它提供了一种核心类型,Observable,广播类型(Observer,Schedulers,Subjects)和受Array#extras(map,filter,reduce,every等)启发的运算符,允许将异步事件作为集合处理。

ReactiveX将Observer模式与Iterator模式和函数编程与集合相结合,以满足管理事件序列的理想方式的需求。

RxJS中解决异步事件管理的基本概念是:

  • Observable:可观察对象,表示可以调用的未来值或事件集合的想法。
  • Observer:观察者,是一组回调函数,处理Observable提供的值。
  • Subscription:订阅关系,表示Observable的执行,主要用于取消执行。
  • Operators:算子,是纯粹的函数,用函数式编程风格处理值或事件集合,map,filter,concat,flatMap等。
  • Subject:主题,相当于EventEmitter,是将值或事件广播到多个Observer的唯一方法。
  • Scheduler:控制并发的集中调度器,使我们能够协调发生在setTimeout或requestAnimationFrame或其他的事件。

第一个例子

通常,您注册事件侦听器。

var button = document.querySelector('button');
button.addEventListener('click',() => console.log('Clicked!'));

使用RxJS可以创建一个observable。

var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
    .subscribe(() => console.log('Clicked!'));

Purity 纯粹性

RxJS的强大之处在于它能够使用纯函数生成值。这意味着您的代码不容易出错。

通常你会创建一个不纯的函数,其中你的代码的其他部分可能会搞乱你的状态。

var count = 0;
var button = document.querySelector('button');
button.addEventListener('click', () => console.log(`Clicked ${++count} times`));

使用RxJS可以隔离状态。

var button = document.querySelector('button');
Rx.Observable.fromEvent(button,'click')
    .scan(count => count + 1, 0)
    .subscribe(count => console.log(`Clicked ${count} times`))

scan操作符就像数组的reduce函数,回调函数接受一个参数,初始值为0,返回的值作为下一个回调函数的入参。

Flow 流

RxJS拥有一系列操作符,可帮助您控制事件如何流经您的可观察对象。

这是使用纯JavaScript的每秒最多允许一次点击的方式:

var count = 0;
var rate = 1000;
var lastClick = Date.now() - rate;
var button = document.querySelector('button');
button.addEventListener('click', () => {
    if (Date.now() - lastClick >= rate){
        console.log(`Clicked ${++count} times`);
        lastClick = Date.now();
    }
});

使用RxJS:

var button = document.querySelector('button');
Rx.Observable.fromEvent(button,'click')
    .throttleTime(1000)
    .scan(count => count + 1, 0)
    .subscribe(count => console.log(`Clicked ${count} times`));

其他的流控制符: filter, delay, debounceTime, take, takeUntil, distinct, distinctUntilChanged

Value 值

您可以转换通过您的observable传递的值。

以下是在纯JavaScript中为每次点击添加当前鼠标x位置的方法:

var count = 0;
var rate = 1000;
var lastClick = Date.now() - rate;
var button = document.querySelector('button');
button.addEventListener('click', (event) => {
  if (Date.now() - lastClick >= rate) {
    count += event.clientX;
    console.log(count)
    lastClick = Date.now();
  }
});

使用RxJS:

var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
    .throttleTime(1000)
    .map(event => event.clientX)
    .scan((count, clientX) => count + clientX, 0)
    .subscribe(count => console.log(count));

其他产生值得操作符:pluck, pairwise, sample

官网 http://reactivex.io/rxjs/manual/overview.html#introduction

你可能感兴趣的:(RxJS官方教程(一) 概览)