簡體   English   中英

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是異步完成的,但是 function result => {}在同一個異步任務中還是在 Javascript 事件循環中執行?

我問的原因是我在代碼注釋中回避的: // Do something with result that affects the UI

實際上,異步請求回調和訂閱函數也被添加到事件循環中,具體來說,是添加到任務隊列中,並在它為空時推送到堆棧執行。 是一個更詳細的解釋,並參考 Philip Roberts 的這個關於事件循環的精彩視頻。

這完全取決於可觀察對象的類型,有冷熱可觀察對象。 您給出的示例將在進行 http 調用后發出,使用 of 的可觀察對象或行為主體將在訂閱后立即同步運行。

看一下行為主題的源代碼

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

你會看到下一個調用訂閱。

這完全取決於可觀察的類型。

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

null 通過不通過任何調度程序,通知以同步和遞歸方式傳遞。 將此用於恆定時間操作或尾遞歸操作。

默認是同步的,http observable 沒有設置調度器

angular http 可觀察

但是對於您的問題,我假設您正在設置模板中使用的組件的屬性。 除非您在組件中使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM