#typescript #rxjs
#typescript #rxjs
Вопрос:
let obs = from([1,2,4]);
let newObs = (o) => of(o).pipe(delay(1000));
obs.pipe(
map(s =>
{
return newObs(s)
}
),
switchAll()
).subscribe(s => console.log(s));
дает мне вывод
4
Однако, если я не использую задержку в newObs
let obs = from([1,2,4]);
let newObs = (o) => of(o);
obs.pipe(
map(s =>
{
return newObs(s)
}
),
switchAll()
).subscribe(s => console.log(s));
дает мне вывод
1
2
4
Почему такое поведение?
Ответ №1:
Это потому, что способ, которым вы настроили Observable во втором примере, все синхронно. from([1,2,4])
будет выдавать элементы один за другим, и вы сопоставляете один элемент с of(item)
, который по-прежнему синхронен. Подводя итог, в этом примере switchAll
мало что делается, каждый элемент будет передаваться синхронно с subscribe
.
Что касается первого примера, вы ввели задержку через of(o).pipe(delay(1000))
, и теперь она асинхронна. Помимо того факта, что он асинхронный, давайте посмотрим на наблюдаемые потоки. После map
того, как у вас будет 3 наблюдаемых, это будет выдавать значение ровно через 1 секунду после подписки. switchAll
В общем, что делает, так это то, что всякий раз, когда появляется новое наблюдаемое, оно подписывается на новое наблюдаемое и отбрасывает старое.
В вашем примере все 3 наблюдаемых объекта поступают одновременно один за другим, поэтому switchAll
они будут подписываться на первый, затем на второй и отбрасывать первый, наконец, подписаться на третий и отбросить второй. В этом процессе ни один из наблюдаемых объектов ничего не выдал, но через одну секунду третий наблюдаемый объект выдаст значение, и вы увидите журнал консоли.