Angular 在forEach循环内调用角度服务

Angular 在forEach循环内调用角度服务,angular,rxjs,Angular,Rxjs,我是英语四级的初学者。 我想用欧元计算发票总额, 我有每个价格的价格值和货币类型。当我想计算总金额时,我需要调用exchangeService服务,以获得货币的汇率 当我检查invoicesSumTotalValue的值时,它是0。 这是我的密码: vTotalValue(){ 让prods=((this.productData.parent.parent.parent).controls['products']); 让invoicesSumTotalValue=0; prods.control

我是英语四级的初学者。 我想用欧元计算发票总额, 我有每个价格的价格值和货币类型。当我想计算总金额时,我需要调用exchangeService服务,以获得货币的汇率

当我检查invoicesSumTotalValue的值时,它是0。 这是我的密码:

vTotalValue(){
让prods=((this.productData.parent.parent.parent).controls['products']);
让invoicesSumTotalValue=0;
prods.controls.forEach(c=>{
让价格=((c).controls['selected_products'])。controls['price'].value;
让currency=((c).controls['selected_products'])。controls['currency'].value;
此.exchangeService.getExchRate(货币,“美元”)。订阅(
vl=>{
设exRate=vl;
发票总额=发票总额+(解析浮点数(价格)*汇率);
},
(错误:any)=>console.log(错误)
);
});
console.log(“发票总额为:”+invoicesSumTotalValue);
如何为prods数组的每个值调用服务?
谢谢!

您应该使用RxJS等待
数组.forEach()
循环完成,然后再返回所有可观察的对象。如果您熟悉JavaScript中承诺的用法,它实际上类似于

您将面临计算
invoicesSumTotalValue
的问题,因为返回观察值是一个异步操作,因此很可能在返回getExchRate()的响应之前执行
forEach
循环的下一次迭代

下面是我对代码的建议修改。基本上,我们利用
forkJoin()
forEach()
循环的所有迭代完成后返回可观察值。从那里开始,在
subscribe()中
块在返回观察值的地方,我们处理
发票总价值的计算

const prods = (<FormArray>(<FormGroup>(<FormArray>this.productData.parent.parent).parent).controls['products']);
const observablesList = [];

prods.controls.forEach(c => {
  const currency = (<FormGroup>(<FormGroup>c).controls['selected_products']).controls['currency'].value;
   observablesList.push(this.exchangeService.getExchRate(currency, 'USD'));
})

forkJoin(observablesList).subscribe(response => {
  //console.log(response);
  // handle the rest
});
constprods=((this.productData.parent.parent.parent).controls['products');
常量observesList=[];
prods.controls.forEach(c=>{
const currency=((c).controls['selected_products'])。controls['currency'].value;
observesList.push(this.exchangeService.getExchRate(currency,'USD'));
})
forkJoin(observesList).subscribe(响应=>{
//控制台日志(响应);
//处理剩下的
});

您正在尝试同步console.log异步值“invoicesSumTotalValue”,这就是问题所在

将方法级变量invoicesSumTotalValue移动到类级,并在HTML模板中打印该值,您将获得实际的总值

由于http服务返回一个可观察的价格值,因此在您执行console.log时,它不会立即可用

修改下面的代码,它会工作得很好:(为了方便在这里显示结果,我模拟了prod数组)

组件代码:

导出类ExchangeComponent实现OnInit{

invoicesSumTotalValue = 0;

constructor(private exchangeService: ExchangeService) { }

ngOnInit() {
    this.calcInvTotalValue();
}

calcInvTotalValue() {

    let prods = [
        {
            price: 10,
            currency: 'INR'
        },
        {
            price: 20,
            currency: 'EUR'
        }
    ];

    prods.forEach(c => {
        let price = c['price'];
        let currency = c['currency'];

        this.exchangeService.getExchangeRate("USD", currency).subscribe(
            vl => {
                let exRate = vl['rates'][currency];
                this.invoicesSumTotalValue = this.invoicesSumTotalValue + (parseFloat(String(price)) * parseFloat(exRate));
            },
            (error: any) => console.log(error)
        );
    });
}
}

模板代码:

{{invoicesSumTotalValue}}

您熟悉哪些编码语言?这里有几件事我会做得不同,但我不想用一种可能很难理解的方式来编写。另外,该服务是从服务器获取汇率?还是已经有了汇率?@theMayer,我正在使用Typescript,我从外部web获取汇率服务API我想他的意思是,为了更好地根据您的背景定制答案,您还熟悉哪些其他语言?如何在forkJoin订阅中实现我的逻辑???@zardosht它实际上与您已经拥有的非常相似。为了澄清您的逻辑,您是否尝试将所有
价格
,乘以
ex费率