Ваш метод получения get translationsAsArray$()
возвращает новый объект Observable каждый раз, когда он вызывается. Канал Angular async
видит новую ссылку на объект, поэтому он подписывается на новую наблюдаемую.
get observableObj() {
// Returns a new object each time
return timer(50);
}
constructor() {
console.log('Testing Observable reference equality');
const obj1 = this.observableObj;
const obj2 = this.observableObj;
console.log('Different Object references?', obj1 !== obj2); // true
}
Вы должны убедиться, что ссылка на наблюдаемый объект остается прежней.
Для этого измените геттер на обычное свойство объекта:
book.translationsAsArray$ = timer(50).pipe(
tap(time => console.log('translationsAsArray subscribed')),
map(time => ['abc'])
)
Если translationsAsArray$
должен быть геттером, вы должны кэшировать возвращаемый объект, чтобы вы могли не возвращайте новую ссылку на объект каждый раз.
Объекты, на которые ссылаются статические переменные, будут собираться только тогда, когда соответствующий AppDomain
является сборщиком мусора. В клиентских приложениях часто бывает только один AppDomain
, который существует на протяжении всего процесса. (Исключение составляют случаи, когда приложение использует архитектуру подключаемых модулей - разные подключаемые модули могут быть загружены в разные AppDomain
s, а AppDomain
может быть выгружен позже.)
In ASP.NET, « повторное использование домена приложений
» происходит периодически (по разным причинам) - когда это происходит, и статические переменные в этом домене приложений
больше не будут действовать как корни сборки мусора и, таким образом, выиграли не предотвращает сборку мусора.
Если вы беспокоились о том, что объект будет собираться мусором, хотя у вас все еще есть ссылка на него через статическую переменную, вы можете расслабиться. У вас есть доступ к объекту, но он не будет собираться мусором.
Члены не собираются ... Объекты.
Так что если вы установите Ref. Введите static member в null, будет собран любой объект, на который он ранее указывал. В противном случае он будет зависать, пока AppDomain не выйдет из строя (каждый AppDomain имеет свой собственный набор статических данных)
Статический член ссылочного типа - это ссылка, которая может указывать, а может и не указывать на экземпляр. Если он указывает на экземпляр, этот экземпляр не будет собираться, пока статический член не будет выгружен. Если тип загружен в конкретный домен приложения, его можно выгрузить. В противном случае это произойдет только тогда, когда приложение будет закрыто.