$函数
$
是 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
,具有以下特性:
使用场景
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 = '上海'
})
注意事项
- 类型推断:
TypeScript
会根据传入的数据类型自动推断流的类型 - 不可变性: 使用
set
方法时,fluth
会自动创建不可变对象,保持引用相等性 - 链式操作: 返回的流支持类似
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, 城市: 上海