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

powertoolsteam 阅读:171 2025-06-02 22:19:02 评论:0

我正在进行 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 
}) 


标签:JavaScript
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号