从里面的forEach进行API调用的每一个元素,并使用可观察的角度获取值(Making api c

2019-09-27 19:09发布

我想通过阵列进行迭代,并希望使后续的API调用,并且,以显示元件的相关值

currentRefValue: any = [];
myArray.droppeditem = [];

somearray.forEach(element => { 
    let objTemp:any = {}

    objtemp.receivedValue = 
    someFunction(element.elementId,element.elementName)

    myArray.droppeditem.push(objTemp);
 })

someFunction(eId,ename){

  let parentObj = this.getExisitingParentObj(eId);

  let parentEquip = parentObj.map(equip => equip.entities.filter(entity => 
  entity.entities.length > 0)[0])[0];

 let ref = this.helperService.getPointId(this.someExisitngObject, 
 ['current', 'desired'], parentEquip.referenceIDs)[0];

 let subs = this.siteService.getPointData(ref, 'current')
                    .pipe(
                        map(this.helperService.stripHaystackTypeMapping),
                    )
                    .subscribe(({ rows }) => {
                        if (rows.length > 0) {
                            this.currentRefValue[ename] = rows[0].val;
                        }
                    });                 
    //someCalculations
    return this.currentRefValue;                    
 }

随后的API调用(this.siteService.getPointData)预期从之前的API调用(this.helperService.getPointId)和先前(this.helperService.getPointId)值inturn已经parentEquip对象。 我想从里面foreach循环调用someFunction,因为我必须让每个元素的currentRefValue

HTML

<div *ngFor="let existingItem of myArray.droppeditem">

 <span>existingItem.receivedValue</span>

</div>

Answer 1:

这不返回你所想象的那样:

objtemp.receivedValue = someFunction(element.elementId,element.elementName)

this.currentRefValue任何HTTP请求完成之前总是返回。 相反,内部认购块数据推送到您的阵列。 这是你的代码的简化样本,因为我们不知道你在你的代码做所有的事情,但它应该这样处理:

this.elements.map(element => {
 // do stuff before http-request
  this.myService.getPointData().pipe(
    map(data => {
      // do stuff with received data and then push to array
      this.myObj.droppedItem.push({ receivedValue: data[0].val });
    })
  ).subscribe();
});

STACKBLIZ

你也可以使用forkJoin并行运行所有这些请求。



Answer 2:

很抱歉,但你混你的应用程序的两个diferent水平:1)获取的数据是一个过程2)显示的数据是diferent过程中不要混了!

PS你们有很多内部的其他物体和另一个物体内部的对象 - 它是坏的pracice(应用架构):没有人能理解你的代码并不能帮助。 使用平面对象作为小而简单越好。 了解更多关于应用程序的架构,智能和转储部件等的良好pracrices希望它可以帮助



文章来源: Making api calls from inside forEach for every element and getting values in Angular using Observable