目标:发出一系列同步 http 请求并能够将它们作为一个可观察流订阅。
示例(不工作):
let query_arr = ['test1','test2','test3']
function make_request(query_arr){
if (query_arr.length){
let payload = JSON.stringify(query_arr[0]);
let headers = new Headers();
query_arr.splice(0,1);
this.http.post('https://endpoint/post',payload,{headers:headers})
.map((res:Response) => {make_request(query_arr)})
}
}.subscribe(
data => console.log('finished http request, moving on to next http request'),
err => console.error(err),
() => console.log('all http requests have been finished')
);
make_request(query_arr)
目标功能:
- 需要知道每个响应的返回时间
- 必须知道所有响应何时返回
最佳答案
您需要利用 flatMap
运算符来连续执行您的请求(一个接一个)。为此,您需要递归地构建数据处理链。这里的重点是在前一个可观察对象(前一个请求返回的那个)上调用操作符。
这样,请求将等待前一个请求完成,然后再执行。订阅时提供的回调将在所有请求执行后调用。
这是此方法的示例实现:
makeRequest(queryArr, previousObservable){
if (queryArr.length) {
let payload = JSON.stringify(queryArr[0]);
let headers = new Headers();
(...)
queryArr.splice(0,1);
var observable = null;
if (previousObservable) {
observable = previousObservable.flatMap(() => {
return this.http.post('https://testsoapi.apispark.net/v1/entities', payload,{
headers:headers
})
.map((res:Response) => res.json())
.do(() => {
console.log('request finished');
});
});
} else {
observable = this.http.post('https://testsoapi.apispark.net/v1/entities', payload, {
headers:headers
})
.map((res:Response) => res.json())
.do(() => {
console.log('request finished');
});
}
return this.makeRequest(queryArr, observable);
} else {
return previousObservable;
}
}
这个方法最初可以这样调用:
test() {
let queryArr = [
{ val: 'test1' },
{ val: 'test2' },
{ val: 'test3' }
];
this.makeRequest(queryArr).subscribe(
() => {
console.log('all requests finished');
});
}
查看此插件:https://plnkr.co/edit/adtWwckvhwXJgPDgCurQ?p=preview .
关于javascript - Angular 2 : Dynamic synchronous http requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432280/