Селектор ngrx несколько раз возвращает одни и те же значения

у меня есть

      export const selectIDs = creteSelector(
    selectorFeature,
    (feature: Feature) => {
        return feature?.metadata?.ids || []
    }
}

в компоненте у меня есть

      this.store.select(selectIDs).subscribe((ids) => dosomething(ids))

Когда система включена, функция undefinedтак []передается в обратный вызов. Затем функция изменяется на нормальное значение, но .metadataнедоступен, поэтому select возвращает [], который совпадает с последним результатом, поэтому dosomething()обратного звонка не должно быть. Но на самом деле он снова вызывается в моем коде с помощью []

Мой вопрос: если оба селектора времени возвращают [], не должен ли обратный вызов (те вызовы в subscribe) быть вызван один раз?

Или вообще я имею в виду, если я сделаю это:

      this.store.select(featueSelector).subscribe((feature) => console.log(feature)

предположим, что глобальное состояние изменяется 10 раз, но функция остается неизменной, поэтому featureSelector возвращает ту же функцию, будет ли вызываться 10 раз? Я предполагаю, что console.log() будет вызываться только тогда, когда возвращаемая функция selectore отличается от последней?

Спасибо

=================== обновил ============= получается this.store.select()возвращает observable, поэтому, когда наблюдаемое вызывает next(), console.log()будет называться.

Запоминание селектора Ngrx означает, что он напрямую возвращает одно и то же значение, если ввод одинаковый.

1 ответ

Селектор запускается снова, и возвращается новый экземпляр массива. Потому что [] === []ложно, новый экземпляр передается методу подписки.

В качестве обходного пути вы можете:

  • отфильтровать наш пустой массив: this.store.select().pipe(filter(arr => arr.length > 0 )).subscribe())
  • используйте отдельный оператор: this.store.select().pipe(distinct(insertCheckHere)).subscribe())
  • Я думаю, вы также можете создать переменную const empty = []и вернуться emptyв селекторе вместо []
Другие вопросы по тегам