RxJS 观察者和订阅者是一回事吗?

时间:2021-04-04 08:43:42

标签: rxjs observable

从此documentation

<块引用>

RxJS 引入了 Observables,这是一个新的 JavaScript 推送系统。 Observable 是多个值的生产者,将它们“推送”给观察者(消费者)。

<块引用>

订阅 Observable 类似于调用函数。

要调用 Observable,我们应该从 Observable 对象本身调用 subscribe() 函数,并将观察者作为由 observable 传递的数据的使用者传递,例如:

observable.subscribe( { /*this is an observer*/ } );

还有这个 documentation 说:

<块引用>

什么是观察者? Observer 是 Observable 传递的值的消费者。 Observers 只是一组回调,用于 Observable 传递的每种类型的通知:next、error 和 complete。下面是一个典型的 Observer 对象的例子:

另一方面,第一个文档说:

<块引用>

Observable 构造函数接受一个参数:subscribe 函数。 下面的示例创建一个 Observable 以每秒向订阅者发送字符串 'hi'。

import { Observable } from 'rxjs';

const observable = new Observable(function subscribe(subscriber) {
  const id = setInterval(() => {
    subscriber.next('hi')
  }, 1000);
});
<块引用>

当使用 Observer 调用 observable.subscribe 时,函数 subscribe in new Observable(function subscribe(subscriber) {...}) 为给定的订阅者运行。对 observable.subscribe 的每次调用都会为该给定订阅者触发其自己的独立设置。

那么实体 Subscriber 只是创建新 Observable 时传递给 subscribe 函数的参数?如果不是订阅者是谁?

观察者和订阅者是同一个实体吗?如本 documentation

中所述

为什么调用 observable.subscribe({observer as call backs}) 的代码不是 observable 的订阅者?就像函数返回值的消费者一样,是调用函数的代码。

1 个答案:

答案 0 :(得分:1)

观察员

const observer = {
  next: v => /* code for next callback*/,
  error: err => /* code for error callback*/,
  complete: () => /* code for completion callback*/
}

订阅

const subscription = {
  unsubscribe: () => /* code for unsubscribe callback */
}

可观察

const observable1 = from([1,2,3,4,5]);
const observable2 = of(1,2,3,4,5);
const observable3 = new Observable(observer => {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.next(4);
  observer.next(5);
  observable.complete();

  return { // return a subscription
    unsubscribe: () => /* code for unsubscribe callback */
  };
});

订阅和使用退回的订阅

// Store a subscription 
const subscription = observable3.subscribe(observer);
// Invoke the unsubscribe callback defined by the observable.
subscription.unsubscribe();

好的。那么什么是订阅者?

<块引用>

[Subscriber] 实现 Observer 接口并扩展 Subscription 类。虽然 Observer 是用于消费 Observable 值的公共 API,但所有 Observer 都会转换为订阅者...订阅者是 RxJS 中的常见类型,对于实现运算符至关重要,但它很少用作公共 API。< /p>

观察者和订阅者是一回事吗?有点,是吗?取决于你问问题的具体程度。

考虑一下:

observable3.subscribe({
  next: v => /* code for next callback */
});

obsevable3.subscribe(
  v => /* code for next callback */
);

第一个是只定义了一个观察者属性的对象。第二个只是一个 lambda 函数。他们最终都产生了基本相同的订阅者。

相关问题