RxJS - подписаться несколько раз на тему с пользовательским оператором - PullRequest
0 голосов
/ 06 февраля 2019

Вопрос

Я создал тему, которая выдает значение каждый раз, когда изменяется содержимое текстового поля.

По этому предмету я планирую провести анализ на основе выданного контента.Для этого я создал трех подписчиков, которые все подписались на тему.

Внутри подписок я запустил 1 пользовательский оператор, чтобы выполнить форматирование так, как мне нужно для анализа.Содержимое, которое я передаю в Subject, представляет собой ops Array, содержащий несколько Deltas внутри (текстовое поле - поле quill-editor).

Первые операторы просто извлекают все содержимое в виде строки и отправляют его.Это работает отлично до сих пор.

Второй принимает ops-Array и выдает каждую дельту в нем как одно значение.

quillDeltaToObservable

export const quillDeltaToObservable = () => (source) =>
new Observable(observer => {
    return source.subscribe({
        next(x) {

            for (let i = 0; i < x.length; i++) {                      
                if (x[i].insert !== "") {
                    observer.next(x[i]);
                }

            }
        },
        error(err) {
            observer.error(err);
        },
        complete() {
            observer.complete();
        },
    });
});

quillDeltaToFulltext

export const quillDeltaToFulltext = () => (source) =>
    new Observable(observer => {
        return source.subscribe({
            next(x) {
                let text = '';
                for (let i = 0; i < x.length; i++) {
                    text += x[i]['insert'];
                }
                observer.next(text.trim());
            },
            error(err) {
                observer.error(err);
            },
            complete() {
                observer.complete();
            },
        });
    });

Проблема

У меня есть 2 подписки на мою тему, которые обе запускают quillDeltaToObservable.Второй, который я называю, получил своего рода входную задержку.

Например, если я запускаю следующее

let Subject = new ReplaySubject(1); 
Subject.next({insert: 1}, {insert: 2}); 

Тогда внутри моей подписки

let subscriptionOne = Subject.pipe(quillDeltaToObservable)
                             .subscribe(x => console.log("One:" + x);
let subscriptionTwo = Subject.pipe(quillDeltaToObservable)
                             .subscribe(x => console.log("Two: " +x); 

Я бы ожидал в качестве вывода

One: 1
Two: 1
One: 2
Two: 2

Я получил следующее:

One: 1
One: 2
Two: 2

Я не уверен, что проблема связана с неправильно используемым объектом или ошибкой в ​​моем пользовательском операторе.

Было бы здорово, если кто-то может помочь!

...