web-dev-qa-db-fra.com

RXJS / Attendez qu'un événement traverse tout le pipeline avant d'émettre le prochain

Je cherche à construire un pipeline RXJS qui émet un événement suivant uniquement si celui-ci est passé à travers tout le pipeline (FIFO STRY).

const { from } = rxjs;
const { map, filter } = rxjs.operators;

// the event `2` should only be emitted
// when the event `1` has reached the end of the pipeline.
// and so on and so fort
from([1, 2, 3, 4, 5, 6, 7]).pipe(
  map((n) => n ** 2),
  filter((n) => n % 2),
).subscribe(console.log);


/**
-1-------|
-2-------|-1
...
**/
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.4.0/rxjs.umd.js" integrity="sha512-DRDXreq+zyiPhlKTfJ5pgzWRn+6SgJ7cPoRxMNksyHmUEOjKiKIoqvssNYNwknpvVbQsVN5hlhh3sp0rxbU7Bg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
2
Hitmands

Ce que vous cherchez de me réassembler une sorte de "Backressure" dans RxJS qui n'est plus maintenu plus et RxJS ne fournit aucun opérateur (ou méthode de création observable) qui ferait exactement ce que vous feriez " re décrit.

Cependant, vous pouvez faire la même chose à l'aide de Zip() Opérateur car il n'émet que lorsque toutes les observables de la source émettent le même nombre de next émissions.

import { Subject, Zip, from, map, startWith } from 'rxjs';

const done$ = new Subject<void>();

Zip(
  from([1, 2, 3, 4, 5, 6, 7]),
  done$.pipe(
    startWith(void 0), // trigger the first emission
  ),
)
  .pipe(
    map(([value]) => value),
  )
  .subscribe(value => {
    console.log(value);
    setTimeout(() => done$.next(void 0), 500);
  });

Démo en direct: https://stackblitz.com/edit/rxjs-oqzeqx?devtoolsheight=6

1
martin