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)
})
Итак, как именно я могу объяснить такое поведение и как правильно поступить в этой ситуации?
switchMap
ничего не кэширует. - person martin   schedule 12.02.2019rxjs
эксперта ни в каком смысле. Я всего лишь один из тех, кто пытается ответить на ваш вопрос. Все, о чем я прошу, это быть добрым к тем, у кого вы просите помощи. В отличие от @Yoshi, вы не предоставили работающий код, то, что вы сделали, опубликовало некоторый частичный код как есть. Я читаю это, как здесь что-то, мне все равно, как вы ответите на это. И ты заставил @Yoshi работать на тебя. Я бы также назвал последний комментарий неуважительным. Однако я надеюсь, что вы получили свой ответ. - person smnbbrv   schedule 12.02.2019too eager
и выполняется только один раз. Все еще не могу полностью понять, какdefer
творит магию. Я думаю, что это разница между объектом и функцией javascript. функция может вызываться снова и снова, в то время как объект не может - person Guichi   schedule 12.02.2019defer
просто оборачивает функцию (это единственный аргумент), которая будет вызываться позже. В контексте это также поток, и на него можно подписаться. - person Yoshi   schedule 12.02.2019