什么是 RxJS
RxJS是一个用于响应式流的库,它基于Observables(可观察对象)和Operators(操作符)的概念。它提供了一种响应式编程的方式,使得异步数据流和事件更容易管理和组合。
什么是流
流可以被视为一个持续的事件序列。它可以是由用户交互、网络请求、定时器等事件触发的数据序列。这?些事件产生的数据会被发送到流中,然后可以被观察者(Observer:是一个回调集合,它知道如何监听 Observable 传来的值。)订阅,以便在数据发生时执行相应的操作。流是一个非常强大的概念,因为它可以帮助我们轻松地处理异步数据和处理数据的实时变化。在RxJS中,我们可以使用各种操作符(operators)来处理流,如map、filter、merge、concat等等,这些操作符可以方便地对流进行转换和组合。
3. 什么是可观察(Observable)
Observable是一个表示事件序列的抽象概念。它可以用来描述从一个事件源(如一个用户界面事件,或一个HTTP响应)发出的异步事件序列。
3. observable和promise有什么区别
Observable 和 Promise 在某些方面是相似的,它们都用于异步编程,但 Observable 提供了更丰富的功能和更灵活的异步数据流处理。 与 Promise 不同,Observable 可以发出多个值,并且还支持取消和错误处理。Observable 表示一个异步数据流,它可以持续地使用next()发出零个、一个或多个值,并且可以在任何时候complete()完成或出错。这使得 Observable 更适合处理需要处理多个事件或需要长时间运行的异步操作的场景,例如基于流的 UI 更新或实时数据源的处理。Observable 不会自动执行,而是需要订阅者(subscriber())显式地订阅 Observable 才能开始发出值。订阅者可以处理每个值,并在需要时取消订阅。 Observable 的多值特性意味着它们可以发出多个值,但也可以只发出一个值或者不发出任何值,这取决于数据源的行为和实现。
Cold(冷)Observables and Hot(热)Observables?有什么区别
冷observable 序列仅在调用 subscribe() 时才开始将值推送给观察者。 如果你想在许多订阅者之间共享一些资源或数据,你必须使用热观察。( Subject(主体): 相当于一个 EventEmitter,也是将一个值或事件多播到多个 Observers 的唯一方式。)
What are RxJS Operators?(什么是 RxJS 运算符?)
以声明方式轻松组合复杂异步代码的基本构造块。
操作符是函数。
有两种操作符:可联入管道的操作符是可以使用语法observableInstance.pipe(operator())联入 Observables 管道的类型。其中包括 [filter(...)] rxjs.tech/api/operato… 和 [mergeMap(...)] rxjs.tech/api/operato… 。调用时,它们不会更改现有的 Observable 实例。相反,它们返回一个新的 Observable,其订阅逻辑是基于第一个 Observable 的。 创建操作符是另一种操作符,可以作为独立函数调用以创建新的 Observable。例如:of(1, 2, 3)创建一个 observable,它将一个接一个地发出 1、2 和 3
What are RxJS Operators?(什么是 RxJS 运算符?)
什么是 Observer? Observer 是 Observable 传递的各个值的消费者。 Observer 只是一组回调,对应于 Observable 传递的每种类型的通知:
next、error和complete。下面是一个典型的 Observer 对象的例子:content_copyopen_in_newconst observer = { next: (x) => console.log('Observer got a next value: ' + x), error: (err) => console.error('Observer got an error: ' + err), complete: () => console.log('Observer got a complete notification'), };订阅是一个表示可释放资源的对象,通常是 Observable 的一次执行。订阅有一个重要的方法
unsubscribe,它不接受任何参数,只是释放本订阅所持有的资源.
什么是 RxJS Subject(主体)?
RxJS Subject 是一种特殊类型的 Observable,它允许将值多播到多个 Observer。虽然普通的 Observable 是单播的(每个订阅的 Observer 都拥有 Observable 的独立执行),但 Subjects 是多播的。
RxJS Subject 几种变体或者类型?
Subjects 的变体之一是
BehaviorSubject,它具有“当前值”的概念。它存储发送给其消费者的最新值,并且每当有新的 Observer 订阅时,它将立即从BehaviorSubject接收到“当前值”。import { BehaviorSubject } from 'rxjs'; const subject = new BehaviorSubject(0); // 0 is the initial value subject.subscribe({ next: (v) => console.log(`observerA: ${v}`), }); subject.next(1); subject.next(2); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`), }); subject.next(3); // Logs // observerA: 0 // observerA: 1 // observerA: 2 // observerB: 2 // observerA: 3 // observerB: 3
ReplaySubject与BehaviorSubject类似,它可以将旧值发送给新订阅者,但它也可以记录 Observable 执行结果的一部分。创建ReplaySubject时,你可以指定要重播的值的数量import { ReplaySubject } from 'rxjs'; const subject = new ReplaySubject(3,100); // 指定要重播的值的数量3 //也可以const subject = new ReplaySubject(3,100); //指定要重播的值的数量3, //但窗口时间参数仅为 `100` 毫秒。 subject.subscribe({ next: (v) => console.log(`observerA: ${v}`), }); subject.next(1); subject.next(2); subject.next(3); subject.next(4); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`), }); subject.next(5); // Logs: // observerA: 1 // observerA: 2 // observerA: 3 // observerA: 4 // observerB: 2 // observerB: 3 // observerB: 4 // observerA: 5 // observerB: 5
AsyncSubject 是一种变体,其中仅将 Observable 执行的最后一个值发送给其 Observer,并且仅在执行完成时发送。(类似于 last()操作符,因为它会等待complete()通知以传递单个值。)
import { AsyncSubject } from 'rxjs'; const subject = new AsyncSubject(); subject.subscribe({ next: (v) => console.log(`observerA: ${v}`), }); subject.next(1); subject.next(2); subject.next(3); subject.next(4); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`), }); subject.next(5); subject.complete(); // Logs: // observerA: 5 // observerB: 5
什么是响应式编程,它与 Angular 有什么关系?
响应式编程的原则是您可以通过指定整个程序来构建不同的流和发生在这些流上的操作。
Angular 将 RxJS 用于其内部服务的某些方面,例如 Http、Router 等。RxJS
是一个非常强大的库,可以促进应用程序的设计。
## 什么是 RxJS Map,什么是高阶 Observable 映射?
RxJS 的高阶映射运算符:switchMap mergeMap concatMap exhaustMap RxJS 高阶映射运算符对于反应式编程中的许多常见操作非常重要。RxJS 映射运算符让我们可以将 Observable 的有效载荷投射到其他东西中。当您开始使用 Rx 运算符来转换、组合、操作和处理 Observables 发出的项目序列时,Observables 的作用就会显现出来。
switchMap :简单来说就是切换到一个新的observable。每次发射都会取消先前的内部可观察对象(您提供的函数的结果),并订阅新的可观察对象。
switchMap :简单来说就是切换到一个新的observable。每次发射都会取消先前的内部可观察对象(您提供的函数的结果),并订阅新的可观察对象。
mergeMap将每个值映射到一个 Observable,然后使用 mergeAll展平所有这些内部 Observable。与 concatMap 不同,在 mergeMap 的情况下,我们不需要等到前一个内部 observable 完成后才能激活下一个内部 observable
concatMap :将每个源值投影到一个 Observable,该 Observable 会合并到输出 Observable 中,会以串行的方式等待每个源值完成,然后再合并下一个。
exhaustMap将每个源值投影成一个 Observable,该 Observable 仅在前一个投影的 Observable 完成时才会合并到输出 Observable 中。
rxjs 节流(throttleTime(毫秒))防抖(debounceTime(毫秒))
throttleTime(毫秒) 从源 Observable 发送一个值,然后在毫秒内忽略后续源值,然后重复此过程。
debounceTime(毫秒) 只有在特定时间跨度过去且源没有发送其它值时,才会从源 Observable 发送通知。