[英]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
是異步完成的,但是 function result => {}
在同一個異步任務中還是在 Javascript 事件循環中執行?
我問的原因是我在代碼注釋中回避的: // Do something with result that affects the UI
這完全取決於可觀察對象的類型,有冷熱可觀察對象。 您給出的示例將在進行 http 調用后發出,使用 of 的可觀察對象或行為主體將在訂閱后立即同步運行。
看一下行為主題的源代碼
https://github.com/ReactiveX/rxjs/blob/master/src/internal/BehaviorSubject.ts
你會看到下一個調用訂閱。
這完全取決於可觀察的類型。
https://rxjs-dev.firebaseapp.com/guide/scheduler
null 通過不通過任何調度程序,通知以同步和遞歸方式傳遞。 將此用於恆定時間操作或尾遞歸操作。
默認是同步的,http observable 沒有設置調度器
但是對於您的問題,我假設您正在設置模板中使用的組件的屬性。 除非您在組件中使用 onPush,否則在 subscribe 塊中設置值將顯示更改。
除非您在多個地方使用訂閱中的值,否則在模板中使用訂閱的最佳方式是執行以下操作:
myexampledata = this.http.get<Result>('http://www.example.com')
然后在模板中
{{myexampledata | async}}
訂閱和取消訂閱將由框架處理。 如果您需要以某種方式更改數據的形狀以進行顯示,您可以將 map 值更改為您想要的值
myexampledata = this.http.get<Result>('http://www.example.com')
.pipe(
map(returnedvalue => returnedvalue.whatiminterestedin)
)
如果您設置在模板中使用的組件的屬性,則 angular 更改檢測將處理更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.