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 的订阅者?就像函数返回值的消费者一样,是调用函数的代码。
答案 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 函数。他们最终都产生了基本相同的订阅者。