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

O decorator "throttle" no meu código não funcionou.

O decorator "throttle" no meu código não funcionou. Mesmo clicando antes de 500ms ele importa várias vezes e adiciona também. Seguem códigos:

throttle

export function throttle(milissegundos = 500) {

    return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {

        const metodoOriginal = descriptor.value;
        let timer = 0;
        descriptor.value = function(...args: any[]){
            clearInterval(timer);
            timer = setTimeout(() => metodoOriginal.apply(this, args), milissegundos);
        }

        return descriptor;
    }

}

NegociacaoController

import { NegociacoesView, MensagemView } from '../views/index';
import { Negociacoes, Negociacao } from '../models/index';
import { NegociacaoParcial } from '../models/index'; 
import { domInject, throttle } from '../helpers/decorators/index';

export class NegociacaoController {

    @domInject('#data')
    private _inputData: JQuery;
    @domInject('#quantidade')
    private _inputQuantidade: JQuery;
    @domInject('#valor')
    private _inputValor: JQuery;
    private _negociacoes = new Negociacoes();
    private _negociacoesView = new NegociacoesView('#negociacoesView'); //Seletor CSS do elemento onde esta view será inserida.
    private _mensagemView = new MensagemView('#mensagemView'); 

    constructor() {
        this._negociacoesView.update(this._negociacoes);
    }

    @throttle()
    adiciona(event: Event) {
        event.preventDefault();
        let data = new Date(this._inputData.val().replace(/-/g, ','));

        if(!this._ehDiaUtil(data)){
            this._mensagemView.update('As negociações só podem ser cadastradas em dias úteis.');
            return
        }

        const negociacao = new Negociacao(
            data,
            parseInt(this._inputQuantidade.val()),
            parseFloat(this._inputValor.val())
        );

        this._negociacoes.adiciona(negociacao);
        this._negociacoesView.update(this._negociacoes);
        this._mensagemView.update('Negociação adicionada com sucesso!');
    }

    private _ehDiaUtil(data: Date) {
        return data.getDay() != DiaDaSemana.Sábado && data.getDay() != DiaDaSemana.Domingo;
    }

    @throttle()
    importarDados() {

        function isOk(res: Response) {

            if(res.ok) {
                return res;
            } else {
                throw new Error(res.statusText);
            }
        }
        fetch('http://localhost:8080/dados')
            .then(res => isOk(res))
            .then(res => res.json())
            .then((dados: NegociacaoParcial[]) => {
                dados
                    .map(dado => new Negociacao(new Date, dado.montante, dado.montante))
                    .forEach(Negociacao => this._negociacoes.adiciona(Negociacao))
                this._negociacoesView.update(this._negociacoes);
            })
            .catch(err => console.log(err)); 
    }
}

enum DiaDaSemana {
    Domingo, 
    Segunda,
    Terça, 
    Quarta,
    Quinta, 
    Sexta,
    Sábado
}
1 resposta
solução!

Funcionou.

Não sei por qual motivo, mas não bastou apenas recarregar a página. Tive que parar o servidor e iniciá-lo novamente para que em Sources (modo de depuração do google), aparecesse o decorator Throttle.