簡體   English   中英

如何在 RxJS 中完成 Observable

[英]How can I complete Observable in RxJS

假設我們有一個Observable

var observable = Rx.Observable
    .fromEvent(document.getElementById('emitter'), 'click');

我怎樣才能讓它完成(什么會觸發所有訂閱的觀察者的onComplete事件)?

在這種目前的形式中,你不能。 您的 observable 源自一個不完整的源,因此它本身無法完成。 您可以做的是使用完成條件擴展此源。 這會像這樣工作:

var end$ = new Rx.Subject();
var observable = Rx.Observable
    .fromEvent(document.getElementById('emitter'), 'click')
    .takeUntil(end$);

當你想結束observable ,你做end$.onNext("anything you want here"); . 那就是在結束事件由您生成的情況下。 如果這是生成該事件的另一個源(按鍵等),那么您可以直接將從該源派生的 observable 作為takeUntil的參數。

文檔:

對我有用的是使用take()運算符。 它將在 x 個事件后觸發完整的回調。 因此,通過傳遞 1,它將在第一個事件之后完成。

打字稿:

private preloadImage(url: string): Observable<Event> {
    let img = new Image();
    let imageSource = Observable.fromEvent(img, "load");

    img.src = url;

    return imageSource.take(1);
}

我認為您正在尋找的是dispose()方法。

來自: https : //github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables

請注意,subscribe 方法返回一個 Disposable,以便您可以取消訂閱序列並輕松處理它。 當您對 observable 序列調用 dispose 方法時,觀察者將停止監聽 observable 的數據。 通常,除非您需要提前取消訂閱,或者當源可觀察序列的生命周期比觀察者更長時,否則您不需要顯式調用 dispose。 Rx 中的訂閱專為即發即忘的場景而設計,無需使用終結器。 請注意,Observable 運算符的默認行為是盡快處理訂閱(即,當發布 onCompleted 或 onError 消息時)。 例如,代碼將 x 訂閱序列 a 和 b。 如果 a 拋出錯誤,x 將立即從 b 取消訂閱。

原來的答案有點復雜,我找到了一種更簡單的方法,方法如下:

const subscription$ = interval(1000).pipe(
  finalize(() => console.log("End")),
).subscribe();

setTimeout(() => {
  subscription$.unsubscribe();
}, 4000);

取消訂閱時也會觸發 finalize。

暫無
暫無

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

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