Как я могу завершить Observable в RxJS

Допустим, у нас есть наблюдаемых:

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

Как я могу сделать это полное (что вызовет onComplete событие для всех подписавшихся наблюдатели) ?

3 ответов


в этой нынешней форме вы не можете. Ваш наблюдаемый выводится из источника, который не завершается, поэтому он сам не может завершиться. Что вы можете сделать, это расширить этот источник с условием завершения. Это будет работать так :

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

когда вы хотите закончить observable, ты end$.onNext("anything you want here");. Это в том случае, если конечное событие генерируется вами. Если это другой источник, генерирующий это событие (нажатие клавиши и т. д.) затем вы можете напрямую поместить наблюдаемое, полученное из этого источника, как аргумент takeUntil.

документы:


то, что сработало для меня, использует take () оператора. Он запустит полный обратный вызов после x числа событий. Таким образом, пройдя 1, он завершится после первого события.

Typescript:

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 возвращает одноразовый, чтобы вы могли отказаться от подписки на последовательность и легко избавиться от нее. При вызове метода dispose в наблюдаемой последовательности наблюдатель прекратит прослушивание наблюдаемых данных. Как правило, нет необходимости явно вызывать dispose, если вам не нужно отменить подписку раньше или если исходная наблюдаемая последовательность имеет более длительный срок службы, чем наблюдатель. Подписки в Rx предназначены для сценариев fire-and-forget без использования финализатора. Обратите внимание, что поведение наблюдаемых операторов по умолчанию заключается в скорейшем удалении подписки (i.e, когда публикуются сообщения onCompleted или onError). Например, код будет подписываться x на оба последовательности a и b. Если a выдает ошибку, x немедленно будет отписан от b.