Это потому, что потоки Rx являются асинхронными.Когда вы настраиваете ваш поток, он действительно настраивает его;но ничего не бежит, пока что-то не слушает.В мире Rx это называется subscribing
.
Когда вы передаете свой поток на AsyncPipe
, используя stream$ | async
;он подпишется, и все функции в потоке установки начнут функционировать по порядку.
Поначалу это кажется нелогичным, но на самом деле это имеет большой смысл.Если вы хотите, чтобы ваш console.log
работал в том порядке, в котором вы хотите, добавьте tap()
operators
, чтобы переопределить ваш поток в соответствии с вашими ожиданиями.
Когда вы сделаете это:
function A() {
const stream$ = this.http.get('my-stream-url').pipe(
tap(() => { console.log('stream is live!') })
)
console.log('But this will show up first, because nothing is listening to the stream$ yet!')
return stream$
}
Вы можете видеть, как поток будет оставаться на прежнем уровне, пока кто-то не начнет слушать его, subscribing
.