Это ожидаемое поведение.Наблюдаемое является холодным в том смысле, что оно не начнет производить ничего, пока первый подписчик не подпишется на него, а затем он не подпишется на Subject
и не выдаст значения от субъекта.Хронология примерно такая:
subject
создано source
создано hot
создано - тайм-аутсозданный
subject
испускает 4
subject
испускает 5
hot
подписан на hot
испускает 1
hot
испускает 2
hot
испускает 3
hot
подписывается на subject
subject
испускает 6
hot
испускает 6
Определение только наблюдаемого создает чертеж наблюдаемого, на самом деле это не Построен , прежде чем подписаться на наблюдаемую.Это также означает, что новая наблюдаемая создается (на основе этой схемы) каждый раз, когда вы подписываетесь на нее.
share
гарантирует, что наблюдаемое создается только один раз, когда первая подписка подписывается на него.Любые последующие подписчики получат уже построенные наблюдаемые.Это разделено между ними.
Обратите внимание, что любые сигналы, испускаемые до подписки, не повторяются.После создания общая наблюдаемая становится горячей, поэтому новые подписчики будут получать только события, отправленные после их подписки.
EDIT :
Представьте, что у вас есть наблюдаемая, которая вызываетweb api каждые 10 секунд:
let getFromWebApi = interval(10 * 1000).pipe(
mergeMap(_ => callWebApi())
)
Теперь представьте, что вы хотите получить эти результаты в пяти разных местах кода, вам нужно сделать следующее:
// Somewhere in your code
getFromWebApi.subscribe(response => /* Handle response */);
// Somewhere else in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A third place in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A fourth place in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A fifth place in your code
getFromWebApi.subscribe(response => /* Handle response */);
Делать это впять разных мест создадут пять наблюдаемых, каждый из которых будет делать отдельный вызов веб-API каждые 10 секунд.Разве не было бы лучше, если бы вы делали только один звонок каждые 10 секунд, и все подписки разделили ответ?Вот что вы сделаете:
let getFromWebApi = interval(10 * 1000).pipe(
mergeMap(_ => callWebApi()),
share()
)
// Somewhere in your code
getFromWebApi.subscribe(response => /* Handle response */);
// ^^^ This will create the observable and start making web requests
// every 10 seconds
// The ones below will not create new observables,
// but receive the same observable as above. They will all receive
// responses every 10 seconds when the original observable returns.
// Somewhere else in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A third place in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A fourth place in your code
getFromWebApi.subscribe(response => /* Handle response */);
// A fifth place in your code
getFromWebApi.subscribe(response => /* Handle response */);
Если вы посмотрите на этот JSBin , вы увидите, что подписка на source
пять раз создает пять «запросов»,Подписка на sharedSource
создает только один «запрос»,