美文网首页
03RxJS Operators操作符(开篇)

03RxJS Operators操作符(开篇)

作者: learninginto | 来源:发表于2021-01-03 00:00 被阅读0次
Operators

之前讲函数式编程,这里要介绍的Operators就是一个个的函数,它具有函数式的特点:没有返回值且不会对原数据产生影响。

即:每个操作符(函数),在拿到原Observable对象后,经过处理返回一个新的Observable。

  • map函数
map(source:Observable<string>, callback:(item:string) => string){
    return new Observable(observe => {
        return source.subscribe(
            value => {
                try{
                    observe.next(callback(value))
                }catch(e){
                    observe.error(e)
                }
            }
        )
    })
}
newObservable(){
    const people of('Jerry','Anna');
    const helloPlople = this.map(people, (item) => 'Hello, ' + item);
    helloPeople.subscribe(res => {
        console.log(res);
    })
}
//Hello, Jerry
//Hello, Anna
  • 分类
  • 管道操作符:filter,take……
  • 创建类操作符:of,from……
  • of
const people = of('Jerry', 'Anna');

相当于new了一个Observable操作,然后进行了两次next操作。

不管of中是数值,还是方法,它都会按顺序发出

const source = of(
    {name:'Brian'},
    [1,2,3],
    function hello(){}
    )
source.subscribe(val => console.log(val));
  • mapTo

mapTo可以把传进来的值改成一个固定的值

map(result: number | string){
    let source$ = interval(1000);
    let newset$ = source$.mapTo(2);
    newest.subscribe(res => {
        console.log(res)
    })
}
from

将字符串、数组、promise或迭代器转换成observable

  • 字符串
const result = from('ok');
result.subscribe(
    res => console.log(res);
    error => console.error(error);
)
//o
//k
  • 转数组
const arraySource = from([1, 2, 3, 4, 5])
const subscribe = arraySource.subscribe(val => console.log(val))
  • 转Promise
const promiseSource1 = from(Promise.resolve('Hello world'))
const promiseSource2 = from(Promise.reject(new Error('error promise')))
const subscribe1 = promiseSource.subscribe(
    val => console.log(val),
    error => console.error(error)
)
//Hello world

const subscribe2 = promiseSource.subscribe(
    val => console.log(val),
    error => console.error(error)
)
//error promise
  • 转Map对象
const map = new Map([[1,'hi']]);
map.set(2,'rxjs');
const mapSource = from(map);
mapSource.subscribe(res => console.log(res));
// [1, "hi"]
// [2, "rxjs"]
  • empty

不带任何数据的Observable,会立即执行complete回调

import {empty} from 'rxjs'
const result = empty();
result.subscribe(
  res => console.log(res),
  error => console.log(error),
  () => console.log('ok'),
)
//ok
  • event事件
const source = fromEvent(document, 'click');
source.subscribe(val => console.log(val))

//MouseEvent {isTrusted: true, screenX: 242, screenY: 495, clientX: 242, clientY: 392, …}

const source = fromEvent(document, 'click');
const example = source.pipe(map(event => `Event time: ${event.timeStamp / 1000}`))
example.subscribe(val => console.log(val))
// 打印程序运行开始到当前点击事件触发的秒数
  • timer

timer中的第一个值为控制延时多少时间第一次触发,第二个值为第一次触发后再间隔多久触发。当第二个参数为空时,相当于延时器。

const source = timer(5000, 1000)
const subscribe = source.subscribe(val => console.log(val));
  • range

连续发出一定范围的数字

import {range} from 'rxjs'
//从0开始,发出4个数字
const numbers = range(4);
numbers.subscribe(x => console.log(x));
//0 1 2 3 

从2开始,发出3个数字

import {range} from 'rxjs'
const numbers = range(2,3);
numbers.subscribe(x => console.log(x));
//2 3 4
  • iif

在被订阅时,根据条件决定,哪个Observable将被订阅

import {iif} from 'rxjs'
const random = Math.random();
const firstOrSecond = iif(
    () => random > 0.5,
    of('random>0.5'),
    of('random<0.5'),
);
firstOrSecond.subscribe(res => {
    console.log('res', res);
})

当iif中的条件(random的值>0.5)成立时,执行iif后的第一个of,否则执行第二个of

  • throwError

创建一个立即触发error回调的Observable

import {throwError} from 'rxjs';
const err$ = throwError(new Error('fail'));
err$.subscribe(res =>{
    console.log('res',res)
},error => {
    console.log(error);
},() => console.log('complete'))
//Error: fail
  • 大理石图Marble diagrams

异步往往是复杂的,尤其是多个异步结合在一起的逻辑,用文字难以表达,所以出现了一种叫Marble diagrams的图形表示法,协助理解各种operators

相关文章

网友评论

      本文标题:03RxJS Operators操作符(开篇)

      本文链接:https://www.haomeiwen.com/subject/ytoyoktx.html