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 不设置调度器
但是对于您的问题,我假设您正在设置模板中使用的组件的 属性。除非您在组件中使用 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 更改检测将处理更新。
我正在尝试了解 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 不设置调度器
但是对于您的问题,我假设您正在设置模板中使用的组件的 属性。除非您在组件中使用 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 更改检测将处理更新。