const s1$ = of(Math.random())
const s2$ = ajax.getJSON(`https://api.github.com/users?per_page=5`)
const s3$ = from(fetch(`https://api.github.com/users?per_page=5`))
const click$ = fromEvent(document, 'click')
click$.pipe(
switchMap(() => s1$)
).subscribe(e => {
console.log(e)
})
Я был смущен приведенным выше кодом и не могу рассуждать о них должным образом.В первом случае (s1$
) каждый раз получен один и тот же результат, он мне смотрится хорошо, хотя я не могу понять, почему switchMap
не запускает новый поток каждый раз.Хорошо, все в порядке
Действительно запутанная вещь случается, когда вы запускаете s2$
и s3$
, выглядит эквивалентно, верно?НЕПРАВИЛЬНО!!!Поведение будет совершенно другим, если вы попробуете их!
Результат s3$
как-то кэшируется, т.е. если вы откроете сетевую панель, вы увидите, что запрос http был отправлен только ОДИН РАЗ.Для сравнения, запрос http отправляется каждый раз для s2$
Моя проблема заключается в том, что я не могу использовать что-то вроде ajax
из rx
напрямую, поскольку запрос http скрыт сторонней библиотекой,Решение, которое я могу придумать, состоит в том, чтобы использовать встроенный поток, то есть каждый раз создавать новый поток
click$.pipe(
switchMap(() => from(fetch(`https://api.github.com/users?per_page=5`)))
).subscribe(e => {
console.log(e)
})
Итак, как именно я могу объяснить такое поведение и как правильно справиться с этой ситуацией?