海綿寶寶撒
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貢獻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
提交
取消