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
3 Réponses :
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') });
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.
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
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") } );
mergeMap
n'attend pas que l'observable interne précédente se termine.
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 fonctionsave
doit retourner un observable.