首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 10 - Chained Promise on Array不计算所有属性

Angular 10 - Chained Promise on Array不计算所有属性
EN

Stack Overflow用户
提问于 2020-07-28 23:44:16
回答 1查看 373关注 0票数 1

我刚接触Angular和TypeScript,遇到了一个问题:我有一个LabObject模型类型的对象数组:我的LabObject模型有相当多的属性,以及两个计算出来的私有属性(private _labTest: numberprivate _vitalSign: number)。

我创建了一个LabObject类型的数组,并使用for循环填充它。当然,我注意到这两个计算在循环仍在运行时不会完成,因为它们相当繁重,所以我想我应该使用promise。我想如果我在第一个promise中运行循环,然后链接两个promise,每个计算一个,这将迫使我的计算在我对该数组做任何其他事情之前完成运行。

看起来我错了,因为并不是所有的数组元素都以计算出的_labTest和_vitalSign结束,而且在某些元素中,它们中的一个或两个都丢失了。

下面是我的方法:

代码语言:javascript
复制
createFile() {

    let getLabObject = new Promise((resolve, reject) => {
      let lab_objects: LabObject[] = [];
      for (let i = 0; i < 10; i++) {
        let lo = this.createLabObject();
        lab_objects.push(lo);
      }
      resolve(lab_objects);
    });

    let getLabTest = objects => {
      return new Promise((resolve, reject) => {
        objects.forEach(item => {
          item.CalculateLabTest();
        });
        resolve(objects);
      });
    };

    let getVitalSign = objects => {
      return new Promise((resolve, reject) => {
        objects.forEach(item => {
          item.CalculateVitalSign();
        });
        resolve(objects);
      });
    };

    let backend = objects => {
      this.http.post('my backend url address', JSON.stringify(objects))
        .subscribe(responseData => {
          console.log(responseData);
        });
    }

    getLabObject.then(objects => {
      return getLabTest(objects);
    }).then(objects => {
      return getVitalSign(objects);
    }).then(objects => {
      return backend(objects);
    });

  }

我得到一个JSON对象,如下所示:

代码语言:javascript
复制
[{id: 1, name: 'name1'},
{id: 2, name: 'name2', _labTest: 10},
{id: 3, name: 'name3', _vitalSign: 17},
{id: 4, name: 'name4', _labTest: 8, _vitalSign: 6}]

但我希望为每个元素计算_labTest和_vitalSign。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 03:47:04

我不认为你需要这样的承诺。实际上,异步代码可能是导致对象不完整的原因。

你要找的是一个getter function。这允许您访问一个方法,该方法计算一个值-如果它是一个属性。因此,它始终是正确的,并且易于访问。

检查此StackBlitz

app.component.ts:

代码语言:javascript
复制
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
  labtest: LabObject[] = [];
  ngOnInit() {
    this.labtest.push( new LabObject( 2, 8 ) );
    this.labtest.push( new LabObject( 2, 5 ) );
    this.labtest.push( new LabObject( 34, 1 ) );
    this.labtest.push( new LabObject( 10, 1 ) );
  }
  log() {
    const json = this.labtest.map( labtest => labtest.as_object() );
    console.log( JSON.stringify(json) );
    // instead of logging you want to submit the JSON to your backend to do whatever you wanted to do...
  }
}

class LabObject {
  constructor( 
    public type_a_test: number, 
    public type_b_test: number 
  ) {}

  private get _labTests(): number {
    return this.type_a_test + this.type_b_test;
  }
  private get _vitalSign(): number {
    return 2;
  }
  public as_object(): object {
    return {
      labtests: this._labTests, 
      vitalsigns: this._vitalSign
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63137974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档