1
votes

Requête http de file d'attente RxJS

J'essaye d'implémenter la sauvegarde dans une séquence dans Angular. Ainsi, la demande de "sauvegarde" doit attendre la fin de la précédente. Je dois attendre car l'appel précédent renvoie un ETag.

Je pensais à une "carte" dans RxJS mais je ne sais pas comment attendre la fin de la précédente.

L'idée principale est illustrée dans: https://stackblitz.com/edit/typescript-mmcqhy?file=index. ts


2 commentaires

Jetez un œil à concatMap . Il attend que son observable interne précédent se termine.


concat en tant qu'opérateur est obsolète . voici un correctif pour votre exemple: stackblitz . et comme Maksim l'a dit plus tard dans les commentaires, votre fonction save doit retourner un observable.


3 Réponses :


0
votes

J'ai fait ce qui suit avec concat:

import { concat } from 'rxjs/observable/concat';

const source = concat(
    this.myService.saveStuff({ test: 'swag' }), //returns an observable
    this.myService.saveStuff({ test: 'yolo' })
);

source.subscribe(
    response => {
        console.log('Called after each successful save');
    },
    () => {
        console.log('Called when an error happens')
    },
    () => {
        console.log('called when all observables are complete')
    });


4 commentaires

Mais n'attendez pas la fin de la première sauvegarde.


peut-être que j'ai mal fait quelque chose mais cela ne fonctionne pas: stackblitz.com/edit/ typescript-mmcqhy? file = index.ts


@PiotrStapp, vous avez fait quelques erreurs dans votre exemple. 1. L'appel Ajax ne doit pas renvoyer d'abonnement, mais doit renvoyer un flux. 2. Exécutez les cours, en utilisant le concat à l'extérieur du tuyau, vous l'utilisez à l'intérieur du tuyau. et quelques autres. J'ai corrigé votre exemple pour travailler stackblitz.com/fork/rxjs?devtoolsheight=60


@PiotrSrapp concat en tant qu'opérateur est obsolète . voici un correctif pour votre exemple: stackblitz . et comme l'a dit Maksim, votre fonction save doit retourner un observable.



1
votes

Une façon pourrait être d'utiliser concatMap , puis appuyez sur pour les journaux internes, mais cela dépend vraiment du comportement que vous attendez.

let save = function(arg){
  console.log("start request")
  return ajax('https://httpbin.org/get').pipe(
    tap(...),
  );
}

callQueue$.pipe(
  concatMap(i => save(i)),
)
.subscribe(result => {
  ...
});

Votre démo mise à jour: https://stackblitz.com/edit/typescript-13jrrk ? file = index.ts


0 commentaires

2
votes

Voici une solution avec la concurence mergeMap - https://stackblitz.com/ edit / typescript-y4nu3i? file = index.ts

callQueue$
.pipe(
    mergeMap(result => save(result), 1)
    )
  .subscribe(
    function (data) {
      console.log("finished OK request")
    }
  );


1 commentaires

mergeMap n'attend pas que l'observable interne précédente se termine.