Селектор 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
в селекторе вместо[]