观察模式
依次输出1、2、3,1.5s后再输出4
import { Observable } from 'rxjs'
const observable = new Observable(subscribe => {
subscribe.next(1)
subscribe.next(2)
subscribe.next(3)
setTimeout(() => {
subscribe.next(4)
subscribe.complete()
}, 1500)
})
observable.subscribe((val: any) => {
console.log(val)
})
定时管道
- interval类似setInterval方法,传入毫秒会自动执行
- .pipe用于处理数据,内部可以传入不同的方法
- .subscribe可以拿到.pipe处理好的数据
- interval有一个返回值,可以调用返回值的unsubscribe方法,手动终止定时任务
import { filter, interval, map, take } from 'rxjs'
const subscribe = interval(100)
.pipe(
take(10), // 约定执行次数
map(v => ({ num: v })), // 修改数据格式
filter(v => v.num % 2 === 0) // 过滤偶数
)
.subscribe(e => {
console.log(e)
if (e.num === 6) subscribe.unsubscribe() // 手动终止subscribe
})
清单demo
按下回车即可新增一条
import { fromEvent, filter, map } from 'rxjs'
// 获取输入框元素和输出列表元素
const inputField = document.getElementById('inputField') as HTMLInputElement
const outputList = document.getElementById('outputList') as HTMLElement
// 创建一个 Observable 来表示输入框的输入事件
const input$ = fromEvent(inputField, 'input').pipe(map(event => (event.target as any).value))
// 订阅输入事件,并在每次输入时更新输出列表
input$.subscribe(value => {
const listItems = outputList.querySelectorAll('li')
if (listItems.length > 0) {
const lastListItem = listItems[listItems.length - 1]
lastListItem.textContent = value
} else {
const listItem = document.createElement('li')
listItem.textContent = value
outputList.appendChild(listItem)
}
})
const enter$ = fromEvent(inputField, 'keydown').pipe(
filter(event => (event as any).key === 'Enter'),
map(event => (event.target as any).value)
)
enter$.subscribe(value => {
const listItem = document.createElement('li')
listItem.textContent = value
outputList.appendChild(listItem)
inputField.value = ''
listItem.textContent = ''
})
nestjs拦截器
基于rxjs的pipe实现
使用map函数,先对返回值空值处理
再使用一次map函数,加入statusCode和message
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'
import { Observable, map } from 'rxjs'
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map(v => (v == null ? '' : v)), // 避免返回空值
map(v => ({ statusCode: 200, message: 'success', result: v })) // 格式处理
)
}
}