Итак, ваша проблема в том, что stream
продолжает излучать даже после того, как messages
пуст.
Вы можете использовать takeWhile
для завершения потока:
const stream = interval(1000).pipe(
map((): Message => messages.pop()),
takeWhile(Boolean),
);
Когда messages
пусто, возвращает undefined
, то есть false
при обращении к логическому значению, поэтому takeWhile(Boolean)
завершит поток.