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?
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];
});
}