昨天介绍 Effect-TS 时,有小伙伴问我:和 RxJS 的语法很像,他们有什么区别?
出于我好奇我摸鱼的时候学习了下,今天分享给大家!使用 Effect 魔法解锁 TypeScript 的函数式超能力!
RxJS 是一个基于 Observables 的库,用于处理异步和基于事件的编程。它通过响应式编程范式,让开发者能够以声明式的方式管理复杂的数据流和事件,下面是几个核心概念
Observable 是 RxJS 的核心,表示一个可以随时间发出多个值的数据流。你可以将其想象成一个“可订阅的管道”,通过它可以接收数据。import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
setTimeout(() => {
subscriber.next(3);
subscriber.complete();
}, 1000);
});
Observer 是订阅 Observable 的对象,包含 next、error 和 complete 方法,用于处理 Observable 发出的值、错误和完成状态。Subscription 是订阅 Observable 后返回的对象,用于管理订阅状态,比如取消订阅const subscription = observable.subscribe({
next: value => console.log(value),
error: err => console.error(err),
complete: () => console.log('Completed')
});
// 取消订阅
subscription.unsubscribe();
map、filter、mergeMap 等),用于转换和操作数据流import { of } from 'rxjs';
import { map, filter } from 'rxjs/operators';
of(1, 2, 3, 4)
.pipe(
filter(x => x % 2 === 0),
map(x => x * 2)
)
.subscribe(x => console.log(x)); // 输出 4, 8
RxJS 的操作符是其强大功能的核心,以下是几个常用的操作符:
Observable 映射为另一个 Observable,并将结果展平。import { fromEvent } from 'rxjs';
import { debounceTime, map } from 'rxjs/operators';
const input = document.querySelector('input');
fromEvent(input, 'input')
.pipe(
debounceTime(300),
map(event => event.target.value)
)
.subscribe(value => console.log(value));
debounceTime 减少不必要的 API 请求。mergeMap 和 filter 处理复杂逻辑。forkJoin 或 combineLatest 组合多个异步请求!import { forkJoin, of } from 'rxjs';
import { delay } from 'rxjs/operators';
const source1 = of('Hello').pipe(delay(1000));
const source2 = of('World').pipe(delay(2000));
forkJoin([source1, source2]).subscribe(([res1, res2]) => {
console.log(`${res1} ${res2}`); // 输出 "Hello World"
});
学习完之后,虽然在语法上颇有相似之处,但是给我的第一感觉:Effect-ts 的设计理念是基于副作用思想的开发范式,而 Rx.js 脱胎于响应式编程思路的开发范式,另外 Rx.js 主打的是处理异步事件流,而 Effect-ts 主打的是比 TypeScript 更安全的类型推理!
官网:https://rxjs.dev/