почему у меня другое поведение для swicthAll

#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 они будут подписываться на первый, затем на второй и отбрасывать первый, наконец, подписаться на третий и отбросить второй. В этом процессе ни один из наблюдаемых объектов ничего не выдал, но через одну секунду третий наблюдаемый объект выдаст значение, и вы увидите журнал консоли.

Смотрите Официальную документацию для switchAll