我正在进行4次异步api调用

floor.entities.forEach(elementId => {
  let objTemp: any = {};

  objTemp.main = elementId.name

  let currentTempForZone;

//1st async function
   this.getCurrentValue(objTemp.main).subscribe((curr) =>
       {
         objTemp.currentTemp = curr.rows[0].val
        }
     );
//2nd async function
    this.getDesiredHeatingTemp(elementId._id).subscribe(([des]) =>
       {
         objTemp.desiredTempHeating = des.rows[0].val.split(':')[1]
        }
      );
//3rd async function
     this.getDesiredCoolingTemp(elementId._id).subscribe(([des]) =>
        {
          objTemp.desiredTempCooling = des.rows[0].val.split(':')[1]
          }
       );

let condition;

//4th
   this.deviceHelper.getConditioningStatusForZone(elementId._id);
   this.deviceHelper.conditioningTypeSubject.subscribe(condType => {
                                  console.log(condType);
                                  condition = condType
               });

if(condition == 'first' ){
     let zoneTempDiff1 = objTemp.currentTemp - objTemp.desiredTempHeating;
     let tempColor1 = this.customColors.filter(color => zoneTempDiff1 < (color.temp + 1) && zoneTempDiff1 > (color.temp - 1));
     objTemp.tempColorToInsert = tempColor1.color
    }
else if(condition == 'second' ){
     let zoneTempDiff2 = objTemp.currentTemp - objTemp.desiredTempCooling;
     let tempColor2 = this.customColors.filter(color => zoneTempDiff2 < (color.temp + 1) && zoneTempDiff2 > (color.temp - 1));
     objTemp.tempColorToInsert = tempColor2.color
      }

      floor.droppeditem.push(objTemp);
}

我正在获取所有3个值objTemp.currentTemp,objTemp.desiredTempHeating,objTemp.desiredTempCooling和条件,但它们都是异步的
使用上述4个值进行计算后,如何为objTemp.tempColorToInsert分配值。

================================================== =========================
customColors: any = [
    {
        color: '#50B3D3',
        temp: -1
    },
    {
        color: '#25CBE4',
        temp: -2
    },
    {
        color: '#25CBE4',
        temp: 0
    },
    {
        color: '#7EE2DD',
        temp: 1
    },
    {
        color: '#7EE2DD',
        temp: 2
    }
    ]

更新

我已经做了类似的事情,并且我正在获取值,只是想知道响应将自动映射到各自的元素
   forkJoin([this.getCurrentValue(objTemp.main),this.getDesiredHeatingTemp(elementId._id),this.getDesiredCoolingTemp(elementId._id)])
        .subscribe(([current,[desiredheat], [desirecooling]])=>{
            objTemp.currentTemp = current.rows[0].val;
            objTemp.desiredTempHeating = desiredheat.rows[0].val.split(':')[1];
            objTemp.desiredTempCooling = desirecooling.rows[0].val.split(':')[1];

                let condition = 'first'

                    if(condition == 'first' ){
                        let zoneTempDiff1 = objTemp.currentTemp - objTemp.desiredTempHeating;
                        let tempColor1 = this.temperatureColors.filter(color => zoneTempDiff1 < (color.temp + 1) && zoneTempDiff1 > (color.temp - 1));
                        objTemp.tempColorToInsert = tempColor1.color
                    }else if(condition == 'second' ){
                        let zoneTempDiff2 = objTemp.currentTemp - objTemp.desiredTempCooling;
                        let tempColor2 = this.temperatureColors.filter(color => zoneTempDiff2 < (color.temp + 1) && zoneTempDiff2 > (color.temp - 1));
                        objTemp.tempColorToInsert = tempColor2.color
                    }
  })

最佳答案

您可以使用 forkJoin

const all$ = [
  this.getCurrentValue(objTemp.main),
  this.getDesiredHeatingTemp(elementId._id),
  this.getDesiredCoolingTemp(elementId._id),
  this.deviceHelper.getConditioningStatusForZone(elementId._id)
]

forkJoin(all$).subscribe(response => {
  objTemp.currentTemp = response[0].rows[0].val;
  objTemp.desiredTempHeating = response[1][0].rows[0].val.split(':')[1];
  objTemp.desiredTempCooling = response[2][0].rows[0].val.split(':')[1];
  condition = response[3];
  // now while you have all 4 values
  // Do your thing here
})

07-27 13:35