nestjs中rxjs的简单使用

观察模式

 

依次输出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 })) // 格式处理
    )
  }
}

参考:小满nestjs(第十五章 nestjs 和 RxJs)_rxjs nestjs_小满zs的博客-CSDN博客icon-default.png?t=N658https://xiaoman.blog.csdn.net/article/details/126912646

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值