Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

@throttle e o NegociacoesService

Estou recebendo erro ao executar a importação usando o decorator throttle

Código do decorator:

export function throttle(delay: number = 500){
    return function(target: any, propertyKey: string, descriptor: PropertyDescriptor){

        const metodoOriginal = descriptor.value;
        let timer: number = 0;

        descriptor.value = function(...args: any[]){
            if(event) event.preventDefault();
            clearInterval(timer)
            timer = setTimeout(() => metodoOriginal.apply(this.args), delay);
        }
        return descriptor;
    }
}

Já a função importaDados:

@throttle()
    importaDados(){
        function retornouSucesso(res: Response){
            if(res.ok){
                return res 
            } else{
                throw new Error(res.statusText);
            }
        }  
        this._negociacaoService
            .obterNegociacoes(retornouSucesso)
            .then(negociacoes => {
                negociacoes.forEach(negociacao => 
                    this._negociacoes.adiciona(negociacao)
            );
            this._negociacoesView.update(this._negociacoes);
        });
    }

Os erros em questão, ocorrem no console do navegador:

util.js:56 Uncaught TypeError: Cannot read property 'fn' of undefined
    at util.js:56
    at util.js:10
    at bootstrap.min.js:6
    at bootstrap.min.js:6
(anonymous) @ util.js:56
(anonymous) @ util.js:10
(anonymous) @ bootstrap.min.js:6
(anonymous) @ bootstrap.min.js:6

e:

negociacaoController.js:55 Uncaught TypeError: Cannot read property '_negociacaoService' of undefined
    at importaDados (negociacaoController.js:55)
    at setTimeout (throttle.js:12)

Não estou conseguindo identificar o problema... Ao comentar a chamada do decorator o erro não ocorre.

1 resposta
solução!

Boa tarde, Filipe! Como vai?

O código do seu decorator não está correto. Se vc reparar, a linha a seguir:

timer = setTimeout(() => metodoOriginal.apply(this.args), delay);

Deveria ser assim:

timer = setTimeout(() => metodoOriginal.apply(this, args), delay);

Faça essa correção aí que tudo deve funcionar como esperado! Caso dê mais algum problema é só falar que eu irei aparecer para te tirar das trevas e levá-lo para a luz do conhecimento!

Grande abraço e bons estudos!

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