如何在 angular 2 中进行同步 http 调用
How to make synchronous http calls in angular 2
这个问题已经有人问过 。但是由于提问者的应用上下文涉及太多,我无法理解基础知识。例如,有一个 queryArr
参数。它有什么作用?
无论如何,我需要一些关于如何以最简单的方式进行同步 http 调用的指导。我想出的解决方案是必须以 "nested" 顺序订阅可观察对象。例如,有 observables ox
和 oy
。 oy
中调用的请求数据取决于来自 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")
);
}
);
我记得上次(我javascript做的不多,是个小菜鸟),在我订阅oy
的范围内,xData
或者yData
看不到了。不对的请指正,指正。
是否有任何 "fine" 解决方案或更好的方法来做这种事情?
我想你可以看看 flatMap
运算符来执行一个 HTTP 请求,等待它的响应并执行另一个请求。
这是一个示例:
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
});
}
如果您想访问 subscribe
方法中的两个结果,您可以利用 Observable.forkJoin
和 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];
});
}
这个问题已经有人问过 queryArr
参数。它有什么作用?
无论如何,我需要一些关于如何以最简单的方式进行同步 http 调用的指导。我想出的解决方案是必须以 "nested" 顺序订阅可观察对象。例如,有 observables ox
和 oy
。 oy
中调用的请求数据取决于来自 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")
);
}
);
我记得上次(我javascript做的不多,是个小菜鸟),在我订阅oy
的范围内,xData
或者yData
看不到了。不对的请指正,指正。
是否有任何 "fine" 解决方案或更好的方法来做这种事情?
我想你可以看看 flatMap
运算符来执行一个 HTTP 请求,等待它的响应并执行另一个请求。
这是一个示例:
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
});
}
如果您想访问 subscribe
方法中的两个结果,您可以利用 Observable.forkJoin
和 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];
});
}