【问题标题】:How to call function inside a function waiting for the response of first function?如何在等待第一个函数响应的函数内部调用函数?
【发布时间】:2019-12-03 22:52:30
【问题描述】:

我需要在我的 ngOnInit 中加载一些数据。

ngOnInit() {

        this.perfilService.getPerfisList()
        .subscribe(res=> {              

            this.perfilData = res;

            for(var i= 0;i < this.perfilData.length ; i++){            
              var Indata = {'idUsuario': this.id, 'idPerfil': this.perfilData[i].id };
              console.log(Indata);
              this.usuarioperfilService.validaUsuariosPerfil(Indata)
              .subscribe(res2 => {
                this.response = res2;
                console.log(res2);    
              });
            }

        });

我需要等待perfilService.getPerfisList 完成,将响应迭代为this.perfilData,然后开始调用this.usuarioperfilService.validaUsuariosPerfil

问题是两个函数同时被调用,所以由于函数 2 的请求是函数 1 的响应,所以还没有响应,所以第二个函数被空请求调用。

在 ngOnInit 期间我该如何管理?

【问题讨论】:

  • 'this.response = res2;'中的'this.response'是什么?
  • ngOnInit 被调用了两次,看stackoverflow.com/a/35763811/3111930
  • @Sebastian ngOnInit 在组件生命周期中仅调用一次。

标签: angular typescript rxjs angular-observable


【解决方案1】:

试试这个:

this.perfilService.getPerfisList().pipe(
    switchMap(perfisList => {
        const innerObservables = perfisList.map(
            perfisItem => this.usuarioperfilService.validaUsuariosPerfil({ 'idUsuario': this.id, 'idPerfil': perfisItem.id }),
        );
        return forkJoin(innerObservables);
    }),
).subscribe(x => console.log(x));

必要的导入:

import { switchMap } from 'rxjs/operators';
import { forkJoin } from 'rxjs'; 

【讨论】:

  • 它给出了这个:src/app/update-usuario/update-usuario.component.ts(40,5) 中的错误:错误 TS2304:找不到名称“switchMap”。 src/app/update-usuario/update-usuario.component.ts(43,112):错误 TS2552:找不到名称“perfilItem”。您指的是 'perfisItem' 吗? src/app/update-usuario/update-usuario.component.ts(45,16):错误 TS2304:找不到名称“forkJoin”。
  • 您当然需要为 switchMap (rxjs/operators) 和 forkJoin (rxjs) 添加导入!是的,我在 perfisItem 上有错字,我已更正,谢谢
  • 仍然给出错误:状态:400,错误:“错误请求”,消息:“缺少必需的请求正文:公共布尔 c…m.br.tcc.workflowtrouble2020.model.UsuarioPerfil)” ,
  • 那是您的后端出错,您发送的 json 缺少该布尔值,只有您可以说出它是哪个布尔值。您需要在此处添加:{ 'idUsuario': this.id, 'idPerfil': perfisItem.id }
  • 不,这与我使用原始代码时遇到的错误相同。返回是一个布尔值,错误是因为请求中没有请求有效负载,我可以看到它。
【解决方案2】:

您可以使用 RxJs 运算符 ma​​pforkJoin 将来自一个可观察对象的响应修改为与另一个响应映射。

more info

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2020-10-30
    • 2019-09-11
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多