Observable 订阅者在哪里执行

Where are Observable subscribers executed

我正在尝试了解 Angular 可观察对象以及订阅的函数是异步调用还是在 Javascript 事件循环中调用。例如,如果我进行以下调用:

    this.http.get<Result>('http://www.example.com').subscribe(result => {
        // Do something with result that affects the UI
    });

我了解实际的网络请求和响应,即 get 是异步完成的,但是函数 result => {} 是在同一异步任务中还是在 Javascript 事件循环中执行的?

我在代码注释中回避的原因:// Do something with result that affects the UI

其实async requests回调和subscribed functions也加入了event loop,具体来说就是任务队列,空的时候入栈执行。 Here is a more detailed explanation and referring about it to this Philip Roberts 关于事件循环的精彩视频。

这完全取决于观察对象的类型,有热观察对象和冷观察对象。您给出的示例将在进行 http 调用后发出,使用 of 制作的可观察对象或行为主题将在订阅完成后立即同步 运行。

行为主体看源码

https://github.com/ReactiveX/rxjs/blob/master/src/internal/BehaviorSubject.ts

你会看到下一个是在订阅时调用的。

这完全取决于可观察对象的类型。

https://rxjs-dev.firebaseapp.com/guide/scheduler

null By not passing any scheduler, notifications are delivered synchronously and recursively. Use this for constant-time operations or tail recursive operations.

默认是同步的,http observable 不设置调度器

angular http observable

但是对于您的问题,我假设您正在设置模板中使用的组件的 属性。除非您在组件中使用 onPush,否则在订阅块中设置值将显示更改。

除非您在多个地方使用订阅中的值,否则在模板中使用订阅的最佳方式是执行如下操作:

myexampledata = this.http.get<Result>('http://www.example.com')

然后在模板中

{{myexampledata | async}}

订阅和退订将由框架处理。如果您需要以某种方式更改数据的形状以进行显示,您可以将值映射到您想要的

myexampledata = this.http.get<Result>('http://www.example.com')
.pipe(
     map(returnedvalue => returnedvalue.whatiminterestedin)
)

如果您为模板中使用的组件设置 属性,则 angular 更改检测将处理更新。