Arrays 数组Don'上的角度10链承诺;不要计算所有属性

Arrays 数组Don'上的角度10链承诺;不要计算所有属性,arrays,angular,typescript,promise,angular10,Arrays,Angular,Typescript,Promise,Angular10,我不熟悉Angular和TypeScript,遇到了一个问题: 我有一个类型为LabObjectmodel的对象数组:我的LabObject模型有很多属性,还有两个计算的私有属性(private\u labTest:number和private\u vitalSign:number) 我创建了一个LabObject类型的数组,并使用for循环填充它。当然,我注意到这两个计算在循环仍在运行时并没有完成,因为它们非常繁重,所以我想我应该使用一个承诺。 我想如果我在第一个承诺中运行循环,然后在那之后链

我不熟悉Angular和TypeScript,遇到了一个问题: 我有一个类型为
LabObject
model的对象数组:我的LabObject模型有很多属性,还有两个计算的私有属性(
private\u labTest:number
private\u vitalSign:number

我创建了一个LabObject类型的数组,并使用for循环填充它。当然,我注意到这两个计算在循环仍在运行时并没有完成,因为它们非常繁重,所以我想我应该使用一个承诺。 我想如果我在第一个承诺中运行循环,然后在那之后链接两个承诺,每次计算一个,这将迫使我的计算在对该数组执行任何其他操作之前完成

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

以下是我的方法:

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);
    });

  }
但是我想计算每个元素的_labTest和_vitalSign。
我做错了什么?

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

你要找的是一份工作。这使您可以访问一个方法,该方法可以像计算属性一样计算值。因此,它总是正确且易于访问。添加一个函数,从
LabObject
中提取一个对象,您就可以将其提交到后端了

检查这个

app.component.ts:

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
    }
  }
}

那么calcs是异步的吗。。?此外,http(如果是角度http)不是承诺,而是可观察的。我认为你根本不需要为承诺操心。@MikeOne,每个计算都很简单:我的模型的一些属性的总和或我的模型中的方法结果的总和。我认为首先使用承诺的唯一原因是因为我发现我没有获得所有元素的所有属性。你能想出另一种方法吗?如果这些函数不是异步的,你可以按顺序调用它们,然后调用http observable并订阅它。我需要查看createLabObject以了解它的功能。后端至少是异步的。。但这没关系,因为这似乎是你最后的行动了。@MikeOne,非常感谢你的帮助。我最终在代码的其他地方发现了错误——我将不正确的数据类型传递给我的LabObject构造函数,这在其他地方造成了混乱。然而,你刚刚给我上了一堂关于异步方法承诺的宝贵一课,我真的很感激。谢谢,@Rob,我在代码的其他地方发现了我的错误(不正确的数据类型),但是你的回答也帮助我改进了代码,让它看起来更加专业:)
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
    }
  }
}