使用来自多个异步调用的值,然后执行计算以推送值

Using values from multiple async calls and then performing calculations to push the value

我正在进行 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 方法合并同步调用,然后在所有调用完成后使用订阅值并将其分配给 tempColorToInsert 变量。

您应该使用 forkJoin 而不是订阅 4 次。

这里有一个例子:learnrxjs forkjoin

为此,您可以使用 RxJS ZIP

并像这样使用它:

zip(asyncCall_1, asyncCall_2, asyncCall_3, asyncCall_4).subscribe(
    ([asyncCall_1_response, asyncCall_2_response, asyncCall_3_response, asyncCall_4_response]) => {
        // your code goes here
    }

只有在返回所有异步调用后,您的 Observable 才会发出这种方式

您可以使用 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
})