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

Uma função then retorna sempre uma Promise?

Para situar, capítulo 5 (Combatendo CallbackHell com promises), tarefa 9 (Simplificando ainda mais nosso código com promises).

O Flávio comenta da seguinte forma:

A ideia é a seguinte, se uma função then possui um retorno, este retorno é acessível para quem encadear uma nova chamada à função then. Sendo assim, onde há resolve trocaremos por um return. Mas cuidado, não esqueça de remover também os () do resolve!

Eu queria entender melhor. No caso, temos o HttpService, que retorna uma Promise. Até aí ok. No NegociacaoService, nós também retornamos uma Promise.

Mas com essa informação em destaque, é possível compreender que, em uma função que fica dentro do then de uma Promise, caso optemos por usar um return, o retorno será também uma Promise!

Meu entendimento está correto?

3 respostas

Fala ai Andre, tudo bem? Não, o retorno precisa ser uma Promise para que seja possível encadear outro then.

Se for um retorno vazio, ele vai retornar vazio.

Espero ter ajudado.

E aí Matheus, firmeza? Acho que não ficou clara a minha dúvida. Vou expor com um exemplo bem simples.

Temos aqui o método get daHttpService.

get(url) {
    return new Promise((resolve, reject) => {
        var req = new XMLHttpRequest();
        req.open("GET", url);
        req.onreadystatechange = () => {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    resolve(JSON.parse(req.response));
                } else {
                    console.log(req.response);
                    reject("Ocorreu um erro ao realizar o get");
                }
            }
        };

        req.send();
    })
}

Esse método retorna uma Promise. Até aí ok. No NegociacaoService, temos o método importaNegociacoesDessaSemana.

importaNegociacoesDessaSemana() {
    return this._http.get("negociacoes/semana")
        .then(result => {
            return result.map(n => new Negociacao(new Date(n.data), n.quantidade, n.valor))
        }).catch(erro => {
            throw new Error("Não foi possível obter as negoações dessa semana")
        });
}

AHH! Entendi agora. Eu achei que o return que fica dentro do then era o que estava retornando uma Promise. Mas na verdade é o return this._http.get.., certo? Esse cara retorna uma Promise que, quando for resolvida vai retornar o array do map (return result.map...).

Correto?

solução!

Fala Andre, é isso ai mesmo, o retorno na verdade é do http.get.

Espero ter ajudado.