Получить последнее значение из наблюдаемого в Angular 8 - PullRequest
0 голосов
/ 13 февраля 2020

Как получить последнее значение из Observable в Angular 8?

let test = new BehaviorSubject<any>('');
test.next(this.AddressObservable);

let lastValue = test.subscribe(data=>console.log(data.value));

Почему-то это не работает, проверка отладчика.

Однако это работает в html, AddressObservable | async

Пытаясь использовать эту ссылку, хотите сохранить значение в переменной или отобразить в журнале консоли. Был бы полезен любой новый синтаксис.

Как получить последнее значение при подписке на Observable?

Примечание:

AddressObservable имеет тип: Observable<AddressDto>

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Вы немного запутались с темой своего поведения и тем, что он делает для вас.

Субъект фактически представляет собой поток значений из какого-то источника, на который вы можете подписаться. Всякий раз, когда выдается новое значение, оно прибывает в ваш метод подписки.

Если у вас есть начальное состояние, вы можете использовать поведение субъекта для инициализации субъекта и обеспечения того, чтобы новые подписчики всегда получали значение.

Если у вас нет начального состояния, но вы хотите, чтобы новые подписчики получали последнее излученное значение при подписке (если оно существует), тогда вы можете использовать тему воспроизведения.

Все значения, которые 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();
}
1 голос
/ 13 февраля 2020

Наблюдаемый не сохраняет значения. Вы должны были подписаться на Observable, чтобы получить данные pu sh в потоке Observable. Я думаю, что ваш AddressObservable является Observable, а не BehaviorSubject. Если вы преобразуете AddressObservable в BehaviorSubject. Это будет работать. В случае AsyncPipe это работает, потому что это asyn c труба подписывается на то же самое.

Измените AddressObservable на тип: BehaviorSubject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...