Jump to content

Angular - subscribe - assíncrono - Como obter um resultado de um subscribe?


Hercles

Recommended Posts

Caros, alguém pode me ajudar? Eu queria que o método abaixo funcionasse… Porém o retorno é vazio, embora no console.log dentro do subscribe vem o array do banco. Dentro do for a variavel this.qdDias vem com o valor e a lista também… mas fora de la, parece que é destruida.

 

obterParametroPrazoMap(nomePrazo: string) : any {
 
        this.service.obterParametrosgeraisMap().pipe(take(1)).subscribe(
            data => {
              this.listParametrosGerais = data.data;
              this.listParametrosGerais.forEach(x =>
          
                 (this.listParametrosGerais, x)
          
                 )
                 for (var i = 0; i < this.listParametrosGerais.length; i++) {

                    if (this.listParametrosGerais[i].chavePrimaria.tipoParametro.nomeTipoParametro === nomePrazo) 
                    {   
                        this.qdDias = this.listParametrosGerais[i].quantidadeDiasPrazo;
                        
                          \\ está com o valor   this.qdDias
                           console.log("Resultado dentro do for: ", this.qdDias)                    
                        break
                    }
                }
            }            
          );
           // fica sem valor   this.qdDias
          console.log("resultado do retorno: " , this.qdDias)
       return this.qdDias;
    }

Alguém sabe como resolve ?

Link to comment
Share on other sites

14 horas atrás, Hercles disse:

Caros, alguém pode me ajudar? Eu queria que o método abaixo funcionasse… Porém o retorno é vazio, embora no console.log dentro do subscribe vem o array do banco. Dentro do for a variavel this.qdDias vem com o valor e a lista também… mas fora de la, parece que é destruida.

Alguém sabe como resolve ?

de forma simples:

- A - o código da sua função tem um "subscribe" porque é algo assíncrono que não sabe quando terá a resposta (não é imediata).

- B - devido a A (assíncrono), a sua função nunca poderia responder sincronamente "return this.qdDias" porque o código passa directamente para esta linha enquanto o código (A) anterior ainda está a correr em background e só quando tiver a resposta é que acionará o respectivo subscribe.

Por isso o seu "return this.qdDias" está vazio (resposta imediata, síncrona) e o outro dentro do "subscribe" está sempre certo (não imediato, assíncrono).

das duas uma:

ou usas directamente código (interno) desta função que tem um "subscribe" onde precisas do valor... e só depois de obteres o resultado é que segues o percurso normal.

ou nesta função, voltas a devolver um "observable" que será consumido onde precisas do valor por um "subscribe"... e só depois de obteres o resultado é que segues o percurso normal.

cps,

  • Vote 2
Link to comment
Share on other sites

Resolvi com Promise.

 

Promise.resolve(2);
        Promise.all([
           this.service.obterParametrosgeraisMap()
                .then((lista: any) => {
                    this.listParametrosGerais = lista.data;
                })
            ,
 this.service.obterParametrosEspecificosMap()
                .then((lista: any) => {
                    this.listParametrosEspecifico = lista.data;
                })
        ]).then(() => {    
            this.iniciarVariaveisDicionario();
 });

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.