昨天介绍 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/