Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Esclarecimento Promise NegociacaoDao

Vi em outro tópico uma resposta referente ao uso do then no NegociacaoDao.

ConnectionFactory
            .getConnection()
            .then(connection => new NegociacaoDao(connection))
            .then(dao => dao.listaTodos())
            .then(negociacoes => negociacoes.forEach(negociacao => this._listaNegociacoes.adiciona(negociacao)))
            .catch(erro => this._mensagem.texto = erro);

Mas lá foi abordado que o then pode retornar qualquer coisa e não só uma promise, porém quando perguntado se poderia ser usado em qualquer método, foi respondido que poderia ser usado mas o método deveria retornar uma promise, não entendi bem, pode retornar qualquer coisa ou não, gostaria por favor de uma explicação mais clara do que porque o then funcionou no NegociacaoDao dando acesso a var dao no código sendo que o constructor de NegociacaoDao não retornava uma promise.

o tópico em questão é esse: https://cursos.alura.com.br/forum/topico-then-sem-o-uso-de-promise-42373

Desde já agradeço.

3 respostas

Bom dia Diego.

O then de uma promise pode retornar qualquer valor seja promise ou não. Se retorna uma promise seu valor resolvido será acessível na próxima chamada do then.

A resposta que dei foi sentido, mas alertando que deve existir uma promise para que no mínimo o primeiro then seja chamado. Talvez não tenha deixado isso claro no post que você ditou, mas foi suficiente para o aluno entender.

Sucesso e bom estudo meu aluno.

Nesse caso, então o primeiro then tem que ser chamado por uma promise a partir dele o(s) próximo(s) then podem não ser promises e vão receber então o retorno do método anterior é isso?

E obrigado pela resposta!

solução!

Isso, mas para deixar claro essa parte "a partir dele o(s) próximo(s) then ". O pulo do gato esta no retorno, não é o then em si.

Se um then retorna uma promise, o resultado resultado resolvido da promise é acessível chamando um próximo then. Se dentro de um then você retorna qualquer coisa que não seja uma promise através de um return, essa coisa é acessada encadeando-se uma nova chamada ao then.

Veja o trecho

            .then(connection => new NegociacaoDao(connection))

O then esta retornando a instância de NegociacaoDao que não é uma promise. E na linha seguinte, você tem acesso a essa instância:

  .then(dao => dao.listaTodos())

Agora,. qual é o retorno ai? O resultado de listaTodos que é uma promise. Então, na próxima chamada ao then você terá acesso ao retorno de listaTodos.

.then(negociacoes => negociacoes.forEach(negociacao => this._listaNegociacoes.adiciona(negociacao)))

O código foi escrito assim para manter estética. Mas ele poderia ter sido escrito assim:

ConnectionFactory
    .getConnection()
    .then(connection => {
        let dado = new NegociacaoDao(connection));
        return dao.listaTodos();
    })
    .then(negociacoes => negociacoes.forEach(negociacao => this._listaNegociacoes.adiciona(negociacao)))
    .catch(erro => this._mensagem.texto = erro);

Ficou mais fácil para entender?

Aguardo seu feedback.