Reputation: 960
I need to send multiple HTTP PUT request to server sequentially (after the next request is only started after completing the previous request, the number of request is not fixed). If I use the below source code, all request will be sent
`listURL.forEach(url => {
const req = new HttpRequest('PUT', url, formData, { reportProgress: true});
httpClient.request(req).subscribe(event=>{});
});`
Is there anyway to execute the requests sequentially?
Upvotes: 2
Views: 1114
Reputation: 3823
If you are not familiar with rxjs, perhaps you can try the following?
let requests = listURL.map(url => new HttpRequest('PUT', url, formData, { reportProgress: true});
function do_seq(i) {
httpClient.request(requests[i]).subscribe(event => {
if (i < requests.length - 1) do_seq(i + 1);
});
}
do_seq(0);
Upvotes: 1
Reputation: 62213
You could use async/await with Promise
to stream line this. Convert the observable to a promise using toPromise()
async doSomethingAsync() {
for(let url of listURL) {
const req = new HttpRequest('PUT', url, formData, { reportProgress: true});
const result = await httpClient.request<ModelHere>(req).toPromise();
// do something with result
}
}
For more on async/await see also this excellent answer and scroll to the heading ES2017+: Promises with async/await.
Upvotes: 5
Reputation:
use reduce
and switchMap
:
['url 1', 'url 2'].reduce((acc, curr) => acc.pipe(
mergeMap(_ => this.mockHttpCall(curr)),
tap(value => console.log(value)),
), of(undefined)).subscribe(_ => console.log('done !'));
Upvotes: 3