RxJs: действие сканирования после завершения сканирования - PullRequest
1 голос
/ 07 мая 2019

Я кодировал эту прямую наблюдаемую:

Observable.of(1, 2, 3)
    .scan((acc, value) => [...acc, value], [])
    .do(acc => {     
        console.log(acc);
    })
    .subscribe();

Выход консоли:

Array(1) [1]
Array(2) [1, 2]
Array(3) [1, 2, 3]

Я думал, что .do() метод должен быть выполнен после завершения сканирования. Я имею в виду, я ожидал один вывод консоли:

Array(3) [1, 2, 3]

Есть идеи о том, как получить такое поведение?

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Вы можете оформить эту тему

и использовать reduce:

const { of } = rxjs;
const { reduce, tap } = rxjs.operators;

of(1, 2, 3).pipe(
  reduce((acc, value) => [...acc, value], []),
  tap(acc => {     
      console.log('after all the reduction is complete', acc);
  })
).subscribe();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>
0 голосов
/ 07 мая 2019

scan - это разновидность reduce, которая выдает не только последнее значение, но и все сокращения.Например, полезно иметь дело с мутациями состояния, которые рассматриваются как такие сокращения: всякий раз, когда происходит изменение, оно будет публиковаться дальше, и, таким образом, подписчики гарантированно получат последнее состояние.Но в вашем случае reduce необходим, поскольку он публикует последнее сокращение;как следствие, если вы случайно попадете в бесконечный (бесконечный) поток - тот, который никогда не завершится, - вы не сможете уменьшить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...