【发布时间】:2019-01-30 17:21:59
【问题描述】:
我已多次阅读ReactiveX 文档,但仍然无法完全理解当Observer 订阅Observable 时会发生什么。
我们来看一个简单的例子:
import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.complete();
});
const observer = {
next: (x) => console.log('got value ' + x),
error: (err) => console.error('something wrong occurred: ' + err),
complete: () => console.log('done')
};
observable.subscribe(observer);
我的问题:
传递给Observable的subscriber对象从何而来?
observable.subscribe和subscribe在new Observable(function subscribe(subscriber) {...})具有相同的名称。 在图书馆中,它们是不同的,但出于实际目的,您可以 认为它们在概念上是相等的。
所以,显然传递到 Observable 构造函数 (subscriber) 中的 subscribe 回调的对象不是实际上是 observer目的。至少如果你引用上面关于库实际工作方式的引用,则不会。
如果传入的不是observer对象,那么subscriber.next(1)和subscribe.complete()到底调用了什么?这如何连接到observer 中的next 属性?
澄清编辑:
我知道如何使用 RxJS 并且确实可以在概念上 想象 Observer 被注入(正如引文所说)。不过,我想了解它实际上是如何工作的。
【问题讨论】:
-
@ABOS 检查报价,这不是它在库中的工作方式。有点相关,这也不是 Promises 在内部构建的方式。传递给
Promise构造函数(执行器函数)中的回调的reject和resolve函数实际上并非来自then(onResolve, onReject)。它们来自内部 Promise 实现,当被调用时,它们以某种方式执行then中的处理程序(如果附加)。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
@ABOS 我的问题是它实际上是如何工作的。总的来说,我相信,通过深入了解某件事的工作原理,你会更好地应用它。向 OP 添加澄清编辑。
-
将订阅者视为观察者的包装器,确保
next、complete和errror都存在,并且观察者回调抛出的任何错误都会被捕获并正确路由。订阅者本质上是一个实现细节:github.com/ReactiveX/rxjs/issues/2314 -
@cartant 谢谢。不订阅,是不是就好像我们的观察者被直接注入到了 Observable 构造函数中的回调中一样?
-
对
subscribe方法的调用调用传递给Observable构造函数的函数。该函数在内部存储为_subscribe,并使用传递给subscribe方法here 的包装观察者调用 - 请注意包装观察者的toSubscriber调用(就在其上方)。
标签: javascript rxjs reactivex