web-dev-qa-db-fra.com

Comment faire des appels http synchrones dans angular 2

Cette question a déjà été posée ici . Cependant, comme le contexte d'application du demandeur est trop impliqué dans la question, je ne pouvais pas comprendre les bases. Par exemple, il existe un paramètre queryArr. Qu'est ce que ça fait?

Quoi qu'il en soit, j'ai besoin d'un peu de conseils sur la façon de faire des appels http synchrones de la manière la plus simple. La solution que j'ai trouvée est qu'il faut s'abonner aux observables dans un ordre "imbriqué". Par exemple, il existe des observables ox et oy. Les données de la demande appelée dans oy dépendent des données provenant de ox:

xData: string = "";
yData: string = "";  

ox.subscribe(
    data => {xData = data;},
    error => console.log(error),
    () => {
        oy.subscribe(
            data => {yData = xData*data;},
            error => console.log(error),
            () => console.log("aaa")
        );
    }
);

La dernière fois que je me souviens (je ne fais pas beaucoup de javascript et je suis un petit débutant), dans la portée où je me suis abonné à oy, le xData ou yData ne peut pas être vu plus. Veuillez me corriger et me diriger dans la bonne direction si je me trompe.

Existe-t-il une solution "fine" ou une meilleure façon de faire ce genre de chose?

10
Bora

Je pense que vous pourriez jeter un œil à l'opérateur flatMap pour exécuter une requête HTTP, attendre sa réponse et en exécuter une autre.

Voici un exemple:

executeHttp(url) {
  return this.http.get(url).map(res => res.json());
}

executeRequests() {
  this.executeHttp('http://...').flatMap(result => {
    // result is the result of the first request
    return this.executeHttp('http://...');
  }).subscribe(result => {
    // result is the result of the second request
  });
}

Si vous souhaitez avoir accès aux deux résultats dans la méthode subscribe, vous pouvez utiliser Observable.forkJoin et Observable.of:

executeRequests() {
  this.executeHttp('http://...').flatMap(result => {
    // result is the result of the first request
    return Observable.forkJoin(
      Observable.of(result),
      this.executeHttp('http://...')
    ).subscribe(results => {
    // results is an array of the results of all requests
    let result1 = results[0];
    let result2 = results[1];
  });
}
9
Thierry Templier