一、简介

RxJS 中能够运用构造函数创立可调查目标,但是这种方式显着的便是效率不高。于是 RxJS 针对不同的业务场景,完成了不同的可调查目标的创立操作符。

二、HTTP 恳求

ajax

import { ajax } from 'rxjs/ajax';
const ob$ = ajax('your_url').subscribe({})
const ob$ = ajax.getJSON('your_url').subscribe({})
const ob$ = ajax({
    url: 'your_url',
    method: 'POST',
    headers: {
        // your headers
    },
    body: {
        // your body
    }
}).subscribe({})

ajax 大致与 jQuery 年代的 ajax 运用根本共同,仅仅此处的 ajax 返回的是一个可调查目标。能够订阅这些可调查目标,获取到可调查目标的返回值。当然你能够在可调查目标的 pipe 中处理 ajax 的返回值,然后给订阅目标。

三、回调函数

  • bindCallback
  • bindNodeCallback

bindCallback

绑定回调函数,回调函数一般放在函数参数的最后位置,一个简略的示例:

import { bindCallback } from 'rxjs';
const fnCb = (a,b, cb) => {
    cb(a, b, {p: 1})
}
const boundFnCb = bindCallback(fnCb);
boundFnCb('3', 'c').subscribe({
    next(v) {console.log(v)} // [ '3', 'c', { p: 1 } ]
})

自动履行 callback, 而且组合参数到数组中。

bindNodeCallback

绑定 node.js 中的回调函数,以 fs 为例,运用读取文件为例:

import { bindNodeCallback } from 'rxjs'
import * as fs from 'fs'
const readFile = bindNodeCallback(fs.readFile)
readFile('./groupBy.js', 'utf-8').subscribe({
  next(v) {
    console.log(v) // 具体的文件的内容
  }
})

四、时间

defer

推迟创立可调查目标,具有了懒的特性,只有在订阅了才创立。

import { defer, of } from 'rxjs'
const d$ = defer(() => of(1,2,3))
d$.subscribe({
    next(v) {console.log(v)}
})

of 操作符是一个创立型的操作符,直接运用 of 操作符,通过 defer 包裹之后,它就不会直接创立。当咱们订阅之后,这个可调查目标才会被创立。

timer

timer 能够承受三个参数作为参数:

  • dueTime: (number/Date) 等待时间
  • intervalOrScheduler: 定时器或i这调度器
  • scheduler: 可选的调度器
import { timer, interval, of } from 'rxjs';
timer(1000)
  .pipe(concatMap(() => of(1, 2, 3)))
  .subscribe({
      next(v) {console.log(v)}
  });
timer(0, 1000).subscribe(n => console.log('timer', n));

interval

创立定时器可调查目标

interval(1000).subscribe(n => console.log('interval', n));

完成与 timer 传递第二个参数时能够等价完成。

五、数据规模

range 指定规模

运用 range 操作符创立一个规模:

import { range } from 'rxjs';
const numbers = range(1, 3);
numbers.subscribe({
  next: value => console.log(value),
  complete: () => console.log('Complete!')
});

此刻与效果 of(1,2,3) 类似。

generate

range 是指定数字规模,generate 能够根据条件生成,履行不同的条件生成不同的数据。generate 能够承受的参数比较多,所以比 range 要更加灵活的生成数据。

  • init: 指定初始状态
  • condition: 停止生成条件
  • iterate: 迭代步长函数
  • resultSelector: 结果选择器
  • scheduler: 调度器
import { generate } from "rxjs";
const initialState = 0;
const condition = (x) => x < 10;
const iterate = (x) => x + 1;
const resultSelector = (x) => x;
const result = generate({ initialState, condition, iterate, resultSelector });
result.subscribe((x) => console.log(x));

因为 generate 一些写法现已被抛弃,这儿引荐运用目标的办法进行处理。

六、空值

empty 函数现已被抛弃,运用 EMPTY 常量来代替,订阅时不会触发 next 办法,直接完成。

import { EMPTY } from 'rxjs';
EMPTY.subscribe({
  complete: () => console.log('Complete!')
});

因为不会触发 next 办法,这儿就不写了,直接调用 complete。

七、过错处理

throwError 抛出过错可调查目标。参数是一个函数(引荐运用函数):

import { throwError } from 'rxjs'
throwError(() => new Error('my error')).subscribe({
  error(e) {console.log(e)}
})

当然 throwError 是处理过错的创立型函数,在 RxJS 也能够直接抛出一个 JavaScript 过错 new Error()

八、js 根底类型值(静态值)

of

import { of } from 'rxjs';
// 情况
of(10, 20, 30).subscribe({next(v) { console.log(v) }) // 发出 10 发出 20 发出 30
of([10, 20, 30]).subscribe({next(v) { console.log(v) }) // 发出 [10 20 30]

of 特点是能够承受多个参数,每一个参数独自发射。of 操作符值配合静态数据十分合适

from

from 与 of 不同的,from 承受一个迭代器 iterator 作为参数。当然数组是能够迭代的,下面以数组为例:

import { from } from 'rxjs';
const array = [10, 20, 30];
const result = from(array);

from 解释一个迭代器参数,发射数据的时候,迭代数据发射。

九、事情(dom)

当然 RxJS 在处理 dom 事情时,也很便利,fromEvent 传递 dom 即可获取当时的 dom 的可调查目标。

fromEvent

import { fromEvent } from 'rxjs';
const clicks = fromEvent(document, 'click');
clicks.subscribe(x => console.log(x));

fromEvent 指定 dom 和 dom 对应的事情作为可调查目标。

值得注意的是:fromEvent 是一个热可调查目标。事情有多个监听器,所有 fromEvent 算是热可调查目标,具有多播的特性。

fromEventPattern

fromEventPattern 是 fromEvent 底层版本,需求两个参数,一个是订阅、一个是移除订阅。

import { fromEventPattern } from 'rxjs';
function addClickHandler(handler) {
  // 订阅
}
function removeClickHandler(handler) {
  // 移除订阅
}
const clicks = fromEventPattern(
  addClickHandler,
  removeClickHandler
);
clicks.subscribe(x => console.log(x));

显着 fromEventPattern 关于订阅有更多的操作性,如果是简略的 dom 操作运用 fromEvent 即可。

十、条件

iif

iif 是一个条件创立可调查目标。承受三个参数作为参数:

  • 第一个是一个函数,返回一个布尔值
  • 第二个参数:可调查目标
  • 第三个参数:可调查目标
import { iif, of } from 'rxjs';
let cond;
const who$ = iif(
  () => cond,
  of('first'),
  of('second')
);
cond = false // 指定第一个参数的返回值
who$.subscribe({
    next(v) {console.log(v)}
})

十一、小结

本文将创立型操作符大致分为 9 块内容,都是一些十分常见的 JS 适用场景,包括 dom 事情、ajax 恳求、数据、条件判断、回调函数、过错等。这些操作符式为了便利在业务场景运用时快速的创立可调查目标。如果要娴熟通晓 RxJS 这些操作符的娴熟程度要十分高。