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
}