在订阅Observable的响应时为变量赋值 [英] To assign value to a variable on subscribing to the response of an Observable

查看:81
本文介绍了在订阅Observable的响应时为变量赋值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将响应值分配给ahumode变量,以便在整个类中访问该值,并在分配后调用this.loadFloorLayouts()函数

I want to assign the response value to ahumode variable in order to access the value thoughout the class and after assigning , call this.loadFloorLayouts() function

ahumode = [];

//1st async api
this.siteService.getParamsEquip(this.buildings.ccus[0].referenceIDs.ahu,"system")
.pipe(switchMap( rows =>{
    return rows.rows.map((m) => {
    // this is a custom function
    let ahuId = this.helperService.stripHaystackTypeMapping(m['id']).split(' ')[0];
    console.log(ahuId)
    //2nd async api
    this.siteService.getPointData(ahuId,"current")  
  })  
})
).subscribe(a => {
   this.ahumode = a[0].val;
   this.loadFloorLayouts(this.buildings.floors);
})

a是undefined

如果我尝试这样的事情

ahumode = [];
this.siteService.getParamsEquip(this.buildings.ccus[0].referenceIDs.ahu,"system")
.pipe(switchMap( rows =>{
    return rows.rows.map((m) => {
    let ahuId = this.helperService.stripHaystackTypeMapping(m['id']).split(' ')[0];
    this.ahumode.push(this.siteService.getHisPointData(ahuId,"current"))
    //this.siteService.getPointData(ahuId,"current") 
    this.loadFloorLayouts(this.buildings.floors) 
  })  
})
).subscribe()

我得到一个可观察的物体.

I get an observable object.

我检查了第二个api调用是否也执行了,但无法将值赋给变量

I have checked the 2nd api call also executes but not able to assign the value to the variable

更新

如果我只订阅第一个api调用

If I only subscribe to 1st api call

 this.siteService.getZoneParamsByEquip
  (this.buildings.ccus[0].referenceIDs.ahu,"system").subscribe( r => console.log(r))

这是我得到的答复

{meta: {…}, cols: Array(15), rows: Array(1)}
cols: (15) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
meta: {ver: "2.0"}
rows: Array(1)
  0:
  dis: "Dd_350.1-SystemEquip-operatingMode"
  his: "m:"
  id: "r:5d96e1a12d9dd301026a5654"

我想从此响应中获取ID并使用ID进行第二次api调用

I want to get id from this response and make the 2nd api call using the id

Update2

我尝试了如下方法,但是执行并没有进入管道内部(switchmap和没有错误

I tried sometjing as below but the execution doesnt go inside pipe(switchmap and no errors

this.siteService.getZoneParamsByEquip(
    this.buildings.ccus[0].referenceIDs.ahu,"system")
        .pipe(switchMap( rows =>{
              let responses = [];
              rows.rows.map( (m) => {
              let ahuId = this.helperService
                              .stripHaystackTypeMapping(m['id']).split(' ')[0];

              responses.push(this.siteService.getHisPointData(ahuId,"current"))
              })

              forkJoin(responses).subscribe(([results]) => {
                 //check for the results here and assign them to your variable
                 this.ahumode = results
                 this.loadFloorLayouts(this.buildings.floors);
              })
              return this.ahumode;  
            })
    )

推荐答案

我在注释中添加了解释.

I put explanations in the comments.

ahumode = [];

//1st async api
this.siteService.getParamsEquip(this.buildings.ccus[0].referenceIDs.ahu, "system")
   .pipe(
      switchMap(result =>
         // switchMap expects a function that returns a stream, if you're making several API calls,
         // you need to combine them with forkJoin or combineLatest
         forkJoin(
            // here you'll need an array of streams
            result.rows.data.map(m => {

               let ahuId = this.helperService.stripHaystackTypeMapping(m['id']).split(' ')[0];
               console.log(ahuId)

               // the return statement was missing
               return this.siteService.getPointData(ahuId, "current")
            })
         })))
.subscribe(a => {
   this.ahumode = a[0].val;
   this.loadFloorLayouts(this.buildings.floors);
})

这篇关于在订阅Observable的响应时为变量赋值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆