1
resposta

Trazer variáveis de funções assincronias para o escopo global ou aguardar a função terminar.

this.refContaUsuarioLogadoGlobal esta vindo como undefined e preciso aguardar valor dela para meu código executar corretamente. Na função funciona corretamente o problema é quando preciso do valor dela, porque quando meu site sobre ela esta como undefined.

export class MainService {

    usuarioLogadoUid: string = JSON.parse(localStorage.getItem('user')).uid;
    docUsuarioLogado = this.afs.collection('usuarios').doc(this.usuarioLogadoUid);
    refContaUsuarioLogadoGlobal:string;

    async recuperarContaRefUsuarioLogado() {
      var refContaUsuarioLogado: string;

      this.docUsuarioLogado.ref.get().then(async doc => {
        if (doc.exists) {
          refContaUsuarioLogado = await doc.data().conta_ref._key.path.segments[6];
          console.log(refContaUsuarioLogado)
          this.refContaUsuarioLogadoGlobal = await refContaUsuarioLogado;
        } else {
          console.log("Não localizamos esse documento de Usuario.");
        }
      }).catch(err => {
        console.log(err);
      })
    }

Preciso usar a variável que recebo da função: recuperarContaRefUsuarioLogado() .


    private MarcacoesCollection = this.afs.collection('contas')
      .doc(this.refContaUsuarioLogadoGlobal)
      .collection('marcacoes')

  }

Veja preciso que essa variável this.refContaUsuarioLogadoGlobal já tenha valor quando eu for chamar ela, mas quando eu chamo ela vem como undefined, porque a função recuperarContaRefUsuarioLogado() ainda não foi executada.

1 resposta

Boa tarde, Gustavo! Como vai?

Vc precisa passar esse último trecho de código para dentro do bloco then() visto no primeiro trecho que vc mostrou! Algo assim:

this.docUsuarioLogado.ref.get().then(async doc => {
        if (doc.exists) {
          // Restante do código omitido.

          private MarcacoesCollection = this.afs.collection('contas')
            .doc(this.refContaUsuarioLogadoGlobal)
            .collection('marcacoes');
        } else {
          console.log("Não localizamos esse documento de Usuario.");
        }
      }).catch(err => {
        console.log(err);
      });

Obs.: Em projetos Angular o ideal é trabalhar sempre com Observables do RxJS em vez de trabalhar com Promise uma vez que os Observables são a solução dada pelo framework para resolver questões de assincronicidade!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software