Вам не нужно «буферизовать» значения как таковые, но вы можете создать поток, который зависит от asyn c ipAddress$
, поэтому значение не будет отправлено, пока IP-адрес не будет испускается. combineLatest
подойдет для этой цели.
Давайте дадим LoggerService
поток сообщений с именем message$
и простой log()
метод, который проталкивает предоставленную строку через этот поток .
Мы можем создать поток messagesWithIpAddresses$
, который использует combineLatest
для создания наблюдаемого, который испускает предоставленное сообщение вместе с ipAddress$
, но только после того, как оба фактически выдали значение.
export class LoggerService {
private messages$ = new Subject<string>();
public log(message: string): void {
this.messages$.next(message);
}
constructor(service: GenericService) {
const messagesWithIpAddresses$ = this.messages$.pipe(
mergeMap(message => combineLatest(service.ipAddress$, of(message)))
);
messagesWithIpAddresses$.subscribe(
([ip, message]) => {
// actual logging logic would go here...
console.log(`[${ip}] ${message}`);
}
);
}
}
Поскольку of(message)
будет выдавать немедленно, мы просто будем ждать ipAddress$
. Но, если значение уже было отправлено, оно также будет выполнено немедленно.
Проверьте это работает StackBlitz
образец трансляции экрана