在订阅内的异步函数中丢失对此的引用

问题描述 投票:0回答:1

我对 Angular 几乎是新手,我真的对异步和同步方法、await、observables、promise 迷失了方向…… 我有一个按钮,可以打开模式窗口,读取条形码,并使用该条形码的信息向服务器发出请求并对结果执行某些操作。 这是我的代码:

按钮调用的方法:

<button mat-fab [disabled]="!empleado" extended color="accent" (click)="scanearPlano()" class="mb-2">
scanearPlano(){
    this.dialogInfoEscanenando = this.dialog.open(InfoEscaneandoComponent);
    this.dialogInfoEscanenando.afterClosed().subscribe((datosRecibidos) => {
      if (datosRecibidos) {
        //Obtenemos la info del código de barras
        if(datosRecibidos && datosRecibidos != ''){
          this.inputOf = datosRecibidos;
          this.buscarOF(true);
        }
      }
    });
  }
async buscarOF(autoPlay: boolean){
    if(this.inputOf){
      this.sinOf = false;
      this.partida = null;
      this.plano = null;
      this.inputPlano = '';

      const ordf = this.inputOf;
      try{
        const ordenFabricacion = await this.registroActividadService.getOrdenFabricacion(ordf);
        if(ordenFabricacion){
          this.ordenFabricacion = ordenFabricacion;
          this.inputPedido = this.ordenFabricacion.partida.split("_")[0];
          this.inputPartida = this.ordenFabricacion.partida.split("_")[1];
          await this.buscarPartida(false);
          this.inputOf = this.ordenFabricacion.numero;
          this.plano = this.ordenFabricacion.articulo;
          this.inputPlano = this.ordenFabricacion.articulo.terminoBusqueda;
          if(autoPlay){
            this.play(true);
          }
        }else{
          alert("No se ha encontrado la OF " +ordf);
        }
      }catch (err){
        if (err instanceof Error) {
          this.showError("Error al intentar acceder a los datos. " + err.name, err.message);
        } else {
          this.showError("Error inesperado.", "Ha ocurrido un error desconocido.");
        }
        this.ordenFabricacion = null;
      }
    }else{
      this.inputPedido = '';
      this.inputPartida = '';
      this.partida = null;
      this.inputPlano = '';
      this.plano = null;
    }
  }

如您所见,buscarOf 是一个异步方法。这是因为它正在向服务器发出一些请求,并且我必须对它们使用等待,因为我必须等待其结果继续。

我的问题是在buscarOf内部,对this的引用丢失了,它是未定义的。 如果我在 afterClosed 订阅中调用非异步方法,则这是已定义的,因此我认为问题出在异步方法上。

因为我希望您拥有有关我的代码的所有信息,以便尝试以正确的方式指导我,所以这就是我发出服务器请求的方式:

public async getOrdenFabricacion(numero: string): Promise<OrdenFabricacion>{
    let queryParams = new HttpParams().append("numero", numero);
    return await firstValueFrom(this.http.get<OrdenFabricacion>(this.getOrdenFabricacionUrl, { params: queryParams }));
  }

我尝试将其绑定到这两种方法,但没有成功:

constructor(){
    this.scanearPlano = this.scanearPlano.bind(this);
    this.buscarOF = this.buscarOF.bind(this);
  }

我希望有人能帮助我。 谢谢!!

angular typescript async-await promise observable
1个回答
0
投票

正如 T. Jami 在原帖评论中指出的那样,buscarOf 应该是一个箭头函数,因此将其定义更改为

 buscarOF = async (autoPlay: boolean) => {
//implementation of the method here
}

解决了问题并且this不再是未定义的

© www.soinside.com 2019 - 2024. All rights reserved.