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

Problema Promise

Olá a todos, por favor, necessito de ajudo com isto:

Promise está me retornando o seguinte erro:

NegociacaoController.js:33 Uncaught TypeError: undefined is not a promise

Código:

Negociação Controller:

importar() {

        let service = new NegociacaoService();
       Promise().all(Object.getOwnPropertyNames(Object.getPrototypeOf(service)).filter(method => method != 'constructor'))
            .then(negociacao => negociacao.forEach(negociacao => {this._listaNegociacoes.adiciona(negociacao)}))
            .catch(texto => this._mensagem.texto = texto);
    }

tentei no modo correto (do curso) também, já que eu não consegui testar se o de cima está certo devido o erro me travar:

importar() {

        let service = new NegociacaoService();

       new Promise().all([service.obterNegociacoesDaSemana(), service.obterNegociacoesDaSemanaRetrasada(), service.obterNegociacoesDaSemanaAnterior()])
            .then(negociacao => negociacao.forEach(negociacao => {this._listaNegociacoes.adiciona(negociacao)}))
            .catch(texto => this._mensagem.texto = texto);
    }

Negociação Service:

obterNegociacoesDaSemana() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/semana');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }

Mesmo quando eu troco o

Promise.all()

para

new Promise().all

na tentativa de solucionar, recebo o erro:

Promise resolver undefined is not a function

Como posso resolver isso? Obrigado desde já!

7 respostas

Você esqueceu em algum lugar um return ou escreveu o nome de um método errado.

Poste o código atual completo do controller e do service.

Controller

class NegociacaoController {

    constructor() {

        let $ = document.querySelector.bind(document);

        this._inputData = $('#data');
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');

        this._listaNegociacoes = new Bind(
            new ListaNegociacoes(), 
            new NegociacoesView($('#negociacoesView')), 
            'adiciona', 'esvazia');

        this._mensagem = new Bind(
            new Mensagem(), new MensagemView($('#mensagemView')),
            'texto');       
    }

    adiciona(event) {

        event.preventDefault();
        this._listaNegociacoes.adiciona(this._criaNegociacao());
        this._mensagem.texto = 'Negociação adicionada com sucesso'; 
        this._limpaFormulario();   
    }

    importar() {

        let service = new NegociacaoService();

       new Promise().all([service.obterNegociacoesDaSemana(), service.obterNegociacoesDaSemanaRetrasada(), service.obterNegociacoesDaSemanaAnterior()])
            .then(negociacao => negociacao.forEach(negociacao => {this._listaNegociacoes.adiciona(negociacao)}))
            .catch(texto => this._mensagem.texto = texto);
    }

    apaga() {

        this._listaNegociacoes.esvazia();
        this._mensagem.texto = 'Negociações apagadas com sucesso!';
    }

    _criaNegociacao() {

        return new Negociacao(
            DateHelper.textoParaData(this._inputData.value),
            this._inputQuantidade.value,
            this._inputValor.value);    
    }

    _limpaFormulario() {

        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;
        this._inputData.focus();   
    }
}

Service

class NegociacaoService {

    obterNegociacoesDaSemana() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/semana');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }

    obterNegociacoesDaSemanaAnterior() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/anterior');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }

    obterNegociacoesDaSemanaRetrasada() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/retrasada');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }
}

O correto é Promise.all () e não new Promise.all (). Poste o erro usando a forma correta. Fica tranquilo que mais de 1000 passaram dessa parte sem problema algum. Vamos descobrir o problema do seu código.

Mas teste com o código que ensino e não o seu. No seu você está passando String para all () e não funções. Consegue enxergar o erro?

Instrutor, obrigado pelo suporte até aqui! Eu havia tentado com o código correto (do curso) primeiro. Recebi o mesmo erro realizando os passos convencionais, eu tinha reportado isso no meu post, quando faço o código do curso, eu recebo:

undefined is not a promise

Ficou assim:

NegociaçãoController

importar() {

        let service = new NegociacaoService();

       Promise().all([service.obterNegociacoesDaSemana(), service.obterNegociacoesDaSemanaRetrasada(), service.obterNegociacoesDaSemanaAnterior()])
            .then(negociacao => negociacao.forEach(negociacao => {this._listaNegociacoes.adiciona(negociacao)}))
            .catch(texto => this._mensagem.texto = texto);
    }

NegociaçãoService

class NegociacaoService {

    obterNegociacoesDaSemana() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/semana');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }

    obterNegociacoesDaSemanaAnterior() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/anterior');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }

    obterNegociacoesDaSemanaRetrasada() {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/retrasada');
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        resolve(JSON.parse(xhr.responseText)
                            .map(negociacao => new Negociacao(new Date(negociacao.data), negociacao.quantidade, negociacao.valor)));
                    }
                    else {
                        reject("Um erro ocorreu ao tentar realizar a importação de negociações.");
                    }
                }
            }
            xhr.send();
        });
    }
}

E mesmo assim continua:

undefined is not a promise

O erro é na linha 33 de NegociacaoController:

Promise().all([service.obterNegociacoesDaSemana(), service.obterNegociacoesDaSemanaRetrasada(), service.obterNegociacoesDaSemanaAnterior()])

Valeu!

solução!

O correto é

Promise.all()

É assim que ensino. Você está fazendo Promise().all.

Tente novamente com a sintaxe que lhe passei.

No aguardo.

Putz, Agora que vi, minha falta de atenção me prejudicou bastante. Desculpas pelo tópico desnecessário, bastava concentrar mais. Obrigado pela ajuda!

Relaxa cangaceiro. Eu custei a ver p problema também.

Sucesso e bom estudo!