我想等待三个HTTP请求完成,然后再调用另一个函数来处理这三个HTTP请求返回的数据。
我尝试循环房间数(等于所需的HTTP请求数),然后将设备推入数组。在将设备数组传递到下一个函数之前,我需要完成所有三个HTTP请求。
getDeviceListByRoom(rooms_id_array: string[]) {
console.log('The rooms_id_array is: ', rooms_id_array);
this.room_device_map = new Map;
let count = 0;
for (const id of rooms_id_array) {
const devicesByRoom = this.Services.getDeviceByRoom(id);
devicesByRoom.subscribe((res: any) => {
if (res.code === 200) {
// this statement will map the list of devices to the room.
this.room_device_map.set(id, res.data);
// this statement will just push the list of devices from different room into one array.
this.all_devices_list.push(res.data);
console.log('count is: ', count++);
}
}, err => {
console.error('ERROR', err);
});
console.log('In all_devices_list is: ', this.all_devices_list);
}
console.log('Lalalalal');
}
The code above will return 'Lalalala' first followed by the console print out of the count variable. Understandably, the for...of function is non blocking...?
答案 0 :(得分:1)
forkJoin
是你的朋友。
(在移动设备上,很抱歉,我很简短)
答案 1 :(得分:0)
最简单的方法是“ forkJoin”,在这种情况下,您也可以使用“ zip”或“ combineLatest”。
尝试一下:
import { forkJoin } from 'rxjs';
...
let req1 = this.http.get('xxx');
let req2 = this.http.get('yyy');
forkJoin([req1, req2]).subscribe(res => {
// res[0] is from req1
// res[1] is from req2
});
答案 2 :(得分:0)
所有3个请求均发出后,最新的组合将发出
combineLatest(
this.http.get('request1'),
this.http.get('request2'),
this.http.get('request3')
).subscribe(([response1, response2, response3]) => {
// Here you can do stuff with response1, response2 and response3
});