在 Nestjs已经内置了RxJs,无需安装,并且Nestjs也会有一些基于Rxjs提供的API
Rxjs 中文文档Observable | RxJS 中文文档
概念
RxJs使用的是观察者模式,用来编写异步队列和事件处理。
Observable:可观察的物件
Subscription:监听Observable
Operators:纯函数,可以处理管道的数据,如map、filter、concat、reduce等
案例
Observable的简单用法
类似于迭代器next,observable发出通知,complete通知完成
susubscribe订阅observable发出的通知 ,也就是一个观察者
import { Observable } from "rxjs";
const observable = new Observable((subscribe) => {
subscribe.next(1)
subscribe.next(2)
subscribe.next(3)
// 支持异步,等待2秒后打印出4
setTimeout(() => {
subscribe.next(4)
}, 2000);
})
observable.subscribe({
next:(value)=>{
console.log(value);
}
})
案例1
按顺序从0打印到5,每五百毫秒打印输出一个
interval(500):五百毫秒执行一次
pipe就是管道的意思,管道里面也是可以去掉接口的,支持处理异步数据
通过观察者subscribe接受回调
import { Observable, interval, take } from "rxjs";
interval(500).pipe(take(5)).subscribe((e)=>{
console.log(e);
})
也可以利用map函数把数据改造成对象
import { Observable, interval, map, take } from "rxjs";
interval(500).pipe(map(v => ({ num: v }))).subscribe((e) => {
console.log(e);
})
会一直打印下去不停止
此时利用unsubscribe函数去过滤终止打印
import { Observable, filter, interval, map, take } from "rxjs";
const subs=interval(500).pipe(map(v => ({ num: v }))).subscribe((e) => {
console.log(e);
if(e.num===10){
subs.unsubscribe()
}
})
也可以使用filter过滤想要的结果
import { Observable, filter, interval, map, take } from "rxjs";
const subs = interval(500).pipe(map(v => ({ num: v })), filter(v => (v.num % 2 == 0))).subscribe((e) => {
console.log(e);
if (e.num === 10) {
subs.unsubscribe()
}
})
也可以利用of自定义数据
import { Observable, filter, interval, map, of, take } from "rxjs";
const subs = of(1,2,3,4,5).pipe(map(v => ({ num: v })), filter(v => (v.num % 2 == 0))).subscribe((e) => {
console.log(e);
if (e.num === 10) {
subs.unsubscribe()
}
})