猿问

在继续执行另一个函数之前等待所有 HTTP 请求返回

我想等待三个 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...?


Cats萌萌
浏览 235回答 3
3回答

慕的地10843

forkJoin 是你的朋友。(我在手机上,抱歉我的简短)

三国纷争

一旦所有 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});

忽然笑

最简单的方法是“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});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答