Skip to content

$函数

$Stream 的工厂函数,用于创建一个流。它是 fluth 库中最常用的函数之一,类似于 Promise.resolve() 但支持持续发布数据。

类型定义

typescript
export function $<T = any>(): Stream<T, false>
export function $<T = any>(data: T): Stream<T, true>
export function $<T = any>(data?: T) {
  return new Stream<T, boolean>(data)
}

参数说明

  • data (可选): 流的初始数据
    • 当不传入参数时,创建一个空的流,value 类型为 T | undefined
    • 当传入数据时,创建一个带初始值的流,value 类型为 T

返回值

返回一个 Stream 实例,该实例继承自 Observable,具有以下特性:

  • 可以主动推送数据(通过 next 方法)
  • 支持不可变数据更新(通过 set 方法)
  • 支持链式操作(通过 then 方法)
  • 支持操作符(通过 pipe 方法)
  • 支持插件系统(通过 use 方法)

使用场景

1. 创建空流

typescript
import { $ } from 'fluth'

// 创建空流,初始值为 undefined
const stream$ = $()
console.log(stream$.value) // undefined

// 订阅数据变化
stream$.then((data) => {
  console.log('接收到数据:', data)
})

// 推送数据
stream$.next('hello') // 输出: 接收到数据: hello
stream$.next('world') // 输出: 接收到数据: world

2. 创建带初始值的流

typescript
import { $ } from 'fluth'

// 创建带初始值的流
const stream$ = $('初始值')
console.log(stream$.value) // "初始值"

// 订阅数据变化
stream$.then((data) => {
  console.log(data) // 输出: 初始值
})

// 继续推送新数据
stream$.next('新数据') // 输出: 新数据

3. 创建复杂对象的流

typescript
import { $ } from 'fluth'

// 创建对象流
const user$ = $({ name: '张三', age: 25, address: { city: '北京' } })

// 订阅用户信息变化
user$.then((user) => {
  console.log('用户信息:', user)
})

// 使用 set 方法进行不可变更新
user$.set((user) => {
  user.age = 26
  user.address.city = '上海'
})

注意事项

  1. 类型推断: TypeScript 会根据传入的数据类型自动推断流的类型
  2. 不可变性: 使用 set 方法时,fluth 会自动创建不可变对象,保持引用相等性
  3. 链式操作: 返回的流支持类似 Promise 的链式操作

完整示例

typescript
import { $, combine, consoleNode } from 'fluth'

// 创建多个流
const name$ = $('张三')
const age$ = $(25)
const city$ = $('北京')

// 合并流
const user$ = combine(name$, age$, city$)

// 订阅处理
delayedUser$.then(([name, age, city]) => {
  console.log(`用户: ${name}, 年龄: ${age}, 城市: ${city}`)
})

// 更新数据
name$.next('李四')
age$.next(30)
city$.next('上海')

// 输出: 用户: 李四, 年龄: 30, 城市: 上海