我试图了解 Angular observables 以及订阅的函数是异步调用还是在 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
3 回答

偶然的你
TA贡献1841条经验 获得超3个赞
这完全取决于 observable 的类型,有热的和冷的 observable。您给出的示例将在进行 http 调用后发出,一个由 of 或行为主题构成的可观察对象将在订阅后立即同步运行。
查看一个行为主题的源代码
https://github.com/ReactiveX/rxjs/blob/master/src/internal/BehaviorSubject.ts
你会看到 next 在订阅时被调用。
这一切都取决于可观察的类型。

白衣染霜花
TA贡献1796条经验 获得超10个赞
https://rxjs-dev.firebaseapp.com/guide/scheduler
null 通过不传递任何调度程序,通知以同步和递归的方式传递。将此用于恒定时间操作或尾递归操作。
默认是同步的,http observable 没有设置调度器
但是对于您的问题,我假设您正在设置模板中使用的组件的属性。除非您在组件中使用 onPush,否则在 subscribe 块中设置值将显示更改。
除非您在多个地方使用订阅中的值,否则在模板中使用订阅的最佳方法是执行以下操作:
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))
如果您设置模板中使用的组件的属性,则角度变化检测将处理更新。
添加回答
举报
0/150
提交
取消