Вы немного запутались с темой своего поведения и тем, что он делает для вас.
Субъект фактически представляет собой поток значений из какого-то источника, на который вы можете подписаться. Всякий раз, когда выдается новое значение, оно прибывает в ваш метод подписки.
Если у вас есть начальное состояние, вы можете использовать поведение субъекта для инициализации субъекта и обеспечения того, чтобы новые подписчики всегда получали значение.
Если у вас нет начального состояния, но вы хотите, чтобы новые подписчики получали последнее излученное значение при подписке (если оно существует), тогда вы можете использовать тему воспроизведения.
Все значения, которые go в предмет имеют тип T, где у вас есть Subject<T>
. Таким образом, в вашем случае все, что входит в тему, должно быть AddressDto
.
Если у вас есть начальный адрес, то вы бы настроили тему вашего поведения следующим образом:
// somehow get my initial address
const address = new AddressDto(); //
const test = new BehaviorSubject<AddressDto>(address);
// all subscribers will receive this address upon subscribing
// ... some things happen
// now I have another address, emit that
const newAddress = new AddressDto();
test.next(newAddress);
// all new subscribers will now receive newAddress upon subscribing
С другой стороны, если у вас нет начального адреса, вы можете использовать тему воспроизведения следующим образом:
// always emit the last address to new subscribers by intitialing with a 1
// New subscribers won't receive an address until one is emitted
const test = new ReplaySubject<AddressDto>(1);
// ... some things happen
// now I have my first address, emit that
const firstAddress = new AddressDto();
test.next(firstAddress);
// all current subscribers receive firstAddress
// all future subscribers will receive firstAddress upon subscribing
// ... some things happen
const secondAddress = new AddressDto();
test.next(secondAddress);
// all current subscribers receive secondAddress
// all future subscribers will now receive secondAddress upon subscribing
Редактировать:
Вы спрашивали о сохранении последнего значения в Переменная. То, что вы подразумеваете под этим, является неоднозначным, поэтому я предполагаю, что вы имеете в виду источник, поскольку он более сложный.
Как только вы осознаете концепцию субъекта / наблюдаемого, вы начинаете понимать Идея наблюдаемой трубы. Все виды вещей могут происходить внутри канала - просто представьте, что это последовательность шагов, которые могут произойти с объектом, во многом как последовательность функций связанного массива в обычном javascript массиве.
Одна из вещей, которую вы можете сделать в конвейере, это выполнить «побочные эффекты» в операторе tap()
. Это просто означает, что вы можете делать что-то в середине канала, пропуская данные. Одной из этих вещей может быть сохранение значения в переменной (или в локальном хранилище или для чего-то еще) для какой-либо цели.
Если вы контролируете, что происходит с предметом, кажется излишним делать это в конвейере, поэтому я буду использовать пример кэширования результата http-запроса.
this.http.get(url).pipe(
// transform the http response into an object you have created
map(response => this.mapResponseToMyClass(response)),
// store the mapped object in a local property for later use
tap(myClass => {
// you can perform any side-effect actions you want here
console.log(myClass);
// store the value in a variable
this.cachedMyClass = myClass;
})
);
Передача собственной темы не отличается - все, что входит в тему, будет go через канал и затем отправлено подписчик (и).
private subject = new Subject<AddressDto>();
getPostcode(): Observable<string> {
// reuse the local subject. All subscribers to this function will receive addresses that have come through the pipe.
return subject.pipe(
map(address => address.postcode),
// store the last postcode in a local property
tap(postcode => this.lastPostcode = postcode)
// the postcode still comes out here to all subscribers
).asObservable();
}