1
resposta

Finalizei meu código de requisições diferente do seu.

Foi resolvido de maneira mais simples e em menos linhas. Gostaria de saber se é uma má prática a forma como fiz.

O código das requisições/promises

class NegociacaoServices{

    constructor(){
        this._requisicao = ["semana", "anterior", "retrasada"]
        this._epoca = ["semana", "anterior", "retrasada"]
    }

    obterNegociacaoSemana(){
        return NegociacaoServices.criaPromise(this._requisicao[0], this._epoca[0])
    }

    obterNegociacaoPassada(){
        return NegociacaoServices.criaPromise(this._requisicao[1], this._epoca[1])

    }

    obterNegociacaoRetrasada(){
        return NegociacaoServices.criaPromise(this._requisicao[2], this._epoca[2])

    }

    static criaPromise(requisicao, epoca){
        return new Promise((resolve, reject) =>{
            let mensagem = new Mensagem()
            let xhr = new XMLHttpRequest()
            xhr.open("GET", `negociacoes/${requisicao}`)
            xhr.onreadystatechange = () =>{
                if(xhr.readyState == 4){
                    if(xhr.status == 200){

                        resolve(
                            JSON.parse(xhr.responseText)
                        .map(objt => new Negociacao(
                            new Date(objt.data),
                            objt.quantidade,
                            objt.valor)

                        )


                    )


                    }
                    else{
                        console.log(xhr.responseText)
                        reject(`Não foi possível importar negociacoes da ${epoca}`)
                    }
                }

            }
            xhr.send()



        })
    }
}

Meu Controller:

importaNegociacoes(){
        let service = new NegociacaoServices()

        Promise.all([service.obterNegociacaoSemana(),
        service.obterNegociacaoPassada(),
        service.obterNegociacaoRetrasada()])
        .catch(
            erro => this._mensagem.texto = erro)
        .then(
            negociacao=> 
            negociacao.reduce(
                (reduzida, atual)=> reduzida.concat(atual),[])
            .forEach(n => this._listaNegociacoes.adiciona(n),
            this._mensagem.texto="Negociações importadas com sucesso")


        )

    }

Ele funciona perfeitamente, mas gostaria de saber se isso é uma má prática, por favor.

Abraços e muito obrigado por cada aula.

1 resposta

Fala aí Clayton, beleza? Muito bem, quantos menos código for escrito e repetido é melhor.

Apenas tome cuidado, no seu caso, não fica muito explicito para quem ler o que seriam os indices do array, talvez criar uma constante para eles seria uma solução:

const INDEX_ANTERIOR = 1
const INDEX_PASSADA = 2
const INDEX_SEMANA = 0

Dai você chamaria essas constantes em vez de passar os indices.

obterNegociacaoSemana(){
    return NegociacaoServices.criaPromise(this._requisicao[INDEX_SEMANA], this._epoca[INDEX_SEMANA])
}

Uma outra melhoria, talvez trocar o array por um objeto JSON:

const requisicoes: {
    anterior: 'anterior',
    passada: 'passada'
    semana: 'semana'
}

Ai também poderia utilizá-lo ao contrário dos indices.

obterNegociacaoSemana(){
    return NegociacaoServices.criaPromise(requisicoes.semana, requisicoes.semana)
}

Do resto, está muito bom, parabéns.

Espero ter ajudado.