Ссылаясь на этот билет NGRX, я вижу странность, когда подписка на селектор factory не запускается при обновлении состояния, однако канал async работает .

Чтобы уточнить, если я настрою общедоступное наблюдаемое свойство для компонента и привяжу к нему HTML с помощью канала async, значение будет обновляться по мере обновления состояния.

Component.ts

public test$: Observable<ChatInteraction>;
[...]
this.test$ = this.store
      .select(getNewMessageForChat(this.chat.chatId));

Component.html

test: {{(test$ | async).message}}

Затем я получаю такой вывод, как

test: test1
test: test2
etc etc

Однако, если я пытаюсь подписаться на тот же наблюдаемый объект, он срабатывает один раз при создании подписки, но никогда снова при обновлении состояния.

Component.ts

this.store
      .select(getNewMessageForChat(this.chat.chatId))
      .subscribe(() => {
        if (this._calculateScrollDistanceFromBottom(this.chatWindowElem.nativeElement) <= 20) {
          this._scrollToBottom();
        }
      });

Если я поставлю точку останова на этот оператор if, он не будет достигнут при обновлении состояния.

Есть идеи, почему?

0
Matt M 4 Май 2021 в 22:00

1 ответ

Лучший ответ

Догадаться. Оказалось, что в моей подписке есть ссылка на неопределенный объект, из-за чего подписка прервалась при первом запуске и больше не срабатывала. Это было трудно уловить, так как оказалось, что в коде subscription есть попытка / отказ, если не задана настройка.

__tryOrUnsub(fn, value) {
        try {
            fn.call(this._context, value);
        }
        catch (err) {
            this.unsubscribe();
            if (config.useDeprecatedSynchronousErrorHandling) {
                throw err;
            }
            else {
                hostReportError(err);
            }
        }
    }

hostReportError ничего не пузырило, так что мне казалось, что он больше не стреляет.

0
Matt M 5 Май 2021 в 12:32