为了账号安全,请及时绑定邮箱和手机立即绑定

Observable 订阅者在哪里执行

Observable 订阅者在哪里执行

海绵宝宝撒 2021-12-12 11:01:01
我试图了解 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贡献1797条经验 获得超6个赞

实际上,异步请求回调和订阅函数也被添加到事件循环中,特别是添加到任务队列中,并在任务队列为空时推送到堆栈中执行。这里是一个更详细的解释,并指它以这个为菲利普·罗伯茨有关事件循环伟大的视频。


查看完整回答
反对 回复 2021-12-12
?
偶然的你

TA贡献1841条经验 获得超3个赞

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

查看一个行为主题的源代码

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

你会看到 next 在订阅时被调用。

这一切都取决于可观察的类型。


查看完整回答
反对 回复 2021-12-12
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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

null 通过不传递任何调度程序,通知以同步和递归的方式传递。将此用于恒定时间操作或尾递归操作。

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

角度http可观察

但是对于您的问题,我假设您正在设置模板中使用的组件的属性。除非您在组件中使用 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))

如果您设置模板中使用的组件的属性,则角度变化检测将处理更新。


查看完整回答
反对 回复 2021-12-12
  • 3 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号