簡體   English   中英

RxJS:您如何知道使用Observable.create時需要清除的內容

[英]RxJS: how do you know what needs to be cleaned up when using Observable.create

創建自定義Observable之后,我試圖更好地理解清理。 為了避免內存泄漏,建議您使用一次性功能進行清理。 在這種情況下,我使用定時器的Rx方法而不是setInterval並且我相信當我調用observer.onCompleted()來內部清理定時器時,我的用完即棄是沒有用的。 我對這個過程的理解正確嗎?

function countInterval(interval, times) {
  return Rx.Observable.create(function (observer) {  
    var timerId = Rx.Observable.timer(0, interval)
      .subscribe(count => {
        if (count>=times) {
          console.log('')
          observer.onNext(true);
          // I believe this already cleans up internal
          // references to setTimeout but I am not sure
          observer.onCompleted();
        }
      });

    // creating a disposable
    return () => {
      console.log('dispose')
      timerId.dispose();
    }
  });

}

可以在這里隨意使用此示例: https ://jsbin.com/vojiduzopo/edit?js,console,output還有一個版本,其中我使用setInterval並一次性調用“ clearInterval”。

運作方式如下。

  1. 您將一個函數傳遞給Observable.create 只要訂閱了要創建的可觀察對象,就會調用該函數。
  2. 您的函數將收到一個顯示nexterrorcompleteSubscriber 您的工作是按正確的順序調用這三個函數,從下游觀察者的角度來看,這看起來像是一系列值。
  3. 為了對收到的Subscriber進行正確的調用,您可能會獲取資源,例如正在使用的更基本的可觀察對象的訂閱。 我們將這些稱為上游可觀察值。 (請記住:訂閱需要資源,特別是內存)。 您在create函數主體中進行的訂閱稱為內部訂閱。
  4. 您的create函數返回一個將成為您的dispose方法的函數。 當您創建的可觀察對象被處置時,將通過調用它的complete()方法,錯誤提示或訂閱者手動調用dispose來調用該方法。

您對該過程的理解不正確。 當您向下游觀察者發出完成信號時,下游的對象將被清理,然后將調用dispose方法,以便清理自己。 您確實需要進行一些清理,因為在計時器上進行的內部訂閱不會僅因為處理了下游事務而被清理。 除非您自己處理它,否則計時器仍會計時。 它不知道下游的任何內容,因為您是將其連接到下游觀察者的人。 為了避免泄漏,必須在底部放置Timer子代碼。

使用Rx.Observable.Create創建自己的Observable時,您負責清理內存(如果需要)。 在您的示例中,您創建了一個計時器,如果不對其進行清理,將導致內存泄漏。

流完成后,將調用流中每個Observable的dispose()函數。 手動調用dispose()表示您不再對上游的結果感興趣,並且還會導致dispose()鏈接到上游,除非通過share()類的方法阻止了這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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