Как я могу выдать ошибку асинхронно в RxJs? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть наблюдатель, который отслеживает вопросы и ответы интерфейса командной строки. То, что я хотел бы сделать, это ввести ошибку в наблюдателя с определенным событием в моем коде, чтобы завершить работу наблюдателя и его подписки вниз по течению. Неизвестно, в какое время он запускается.

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

Вотсоответствующий код:

        this.errorInjector$ = new Subject<[discord.Message, MessageWrapper.Response]>();
        ....
        this.nextQa$ = merge(
            nextQa$,
            this.errorInjector$.pipe(
                tap((): void => {
                    throw (new Error('Stop Conversation called'));
                }),
            ),
        );

        // start conversation
        Utils.logger.trace(`Starting a new conversation id '${this.uuid}' with '${this.opMessage.author.username}'`);
    }

    getNextQa$(): Observable<[discord.Message, MessageWrapper.Response]> {
        return this.nextQa$;
    }

    stopConversation(): void {
        this.errorInjector$.next(
            null as any
        );
    }

this.nextQa $ объединяется с локальным nextQa $ и errorInjector $. Я могу подтвердить, что вызывается остановка разговора и что downstream получает this.nextQa $, но я не вижу, чтобы какая-либо ошибка распространялась в нисходящем направлении, когда я пытаюсь внедрить ошибку. Я также попробовал метод this.errorInjector.error () и оператор map () вместо tap (). По какой-то причине я не могу заставить два потока слиться и выбросить свою ошибку. Обратите внимание: this.nextQa $ действительно распространяет ошибки вниз по течению.

Мне кажется, что я что-то упускаю из-за того, как работают слияния или объекты, поэтому любая помощь или объяснение приветствуются.

РЕДАКТИРОВАТЬ

Ну, я только что понял, что мне нужен объект поведения вместо обычной темы. Я предполагаю, что мой вопрос сейчас заключается в том, почему мне нужен BehaviorSubject вместо обычного Subject только для того, чтобы выдать ошибку?

EDIT 2

BehaviorSubject ВСЕГДА выдает эту ошибку, а это не то, что я хочу. Это связано с природой первоначальной эмиссии, но я до сих пор не понимаю, почему я ничего не могу сделать с обычным предметом в этом коде.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Прежде всего, если вы хотите, чтобы объект работал, вы должны подписаться до того, как появится сообщение об ошибке. Таким образом, в вашем коде есть проблема последовательности подписки. Если вы подписываетесь сразу после создания this.nextQa $, вы не должны пропустить ошибку.

this.nextQa$ = merge(
            nextQa$,
            this.errorInjector$.pipe(
                tap((): void => {
                    throw (new Error('Stop Conversation called'));
                }),
            ),
        );
this.nextQa$.subscribe(console.log,console.error)
0 голосов
/ 25 октября 2019

Проблема заключается в получении объекта с stopConversation(): void из объекта словаря, который у меня есть. Объект this определен и показывает, что errorInjector $ определен, но отладчик сообщает, что errorInjector $ стал неопределенным, когда я наведу курсор на значение. По крайней мере, в этом проблема, и мне, вероятно, нужно будет задать еще один вопрос.

...