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

[Bug] Uncaught InternalError: too much recursion

Depois de incluir o formatador de data, esse bug começou a acontecer. O retorno do console do navegador é:

 Uncaught InternalError: too much recursion
    get data http://localhost:3000/js/models/negociacao.js:18
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    get data http://localhost:3000/js/models/negociacao.js:19
    // essa linha se repete muitas vezes mais

O conteúdo de /js/models/negociacao.js é

export class Negociacao {
/* 
    private _data: Date
    private _quantidade: number
    private _valor: number

    constructor(data: Date, quantidade: number, valor: number) {
        this._data = data
        this._quantidade = quantidade
        this._valor = valor
    }
    */
    
    constructor(
        private _data: Date,
        private _quantidade: number,
        private _valor: number) {
    }
                                                   // linha 19
    get data(): Date {
        const data = new Date(this.data.getTime())
        return data
    }
    
    get quantidade():number {
        return this._quantidade
    }

    get valor():number {
        return this._valor
    }

    get volume():number {
       return this._quantidade * this._valor
    }
}
3 respostas

Meu arquivo negociacoes-view.ts:

import { Negociacoes } from "../models/negociacoes.js"

export class NegociacoesView {
    private elemento:HTMLElement

    constructor(seletor: string) {
        this.elemento= document.querySelector(seletor)
    }

    template(model: Negociacoes): string {
        return `
            <table class="table table-hover table-bordered table-striped">
                <thead>
                    <tr class="table-primary">
                        <th>Data</th>
                        <th>Quantidade</th>
                        <th>Valor</th>
                        <th>Volume</th>
                    </tr>
                </thead>
                <tbody>
                    ${model.listar().map(negociacao => {
                        return `<tr>
                            <td>
                                ${new Intl.DateTimeFormat()
                                    .format(negociacao.data)}
                            </td>
                            <td>
                                ${negociacao.quantidade}
                            </td>
                            <td>
                                ${negociacao.valor
                                    .toLocaleString('pt-BR', {
                                        style: 'currency',
                                        currency: 'BRL'
                                    })}
                            </td>
                            <td>
                                ${negociacao.volume
                                    .toLocaleString('pt-BR', {
                                        style: 'currency',
                                        currency: 'BRL'
                                    })}
                            </td>
                        </tr>`
                    }).join('')}
                </tbody>
            </table>
        `
    }

    update(model: Negociacoes): void {
        this.elemento.innerHTML = this.template(model)
    }
}
solução!

Olá! Parece que você está tendo um problema de recursão infinita no seu código. Isso geralmente acontece quando uma função chama a si mesma sem uma condição de parada adequada.

No seu caso, o problema está na função getter data da sua classe Negociacao. Você está criando uma nova data a partir de this.data.getTime(), mas this.data é o próprio getter. Isso está causando a recursão infinita, pois o getter continua chamando a si mesmo.

Para resolver isso, você deve se referir ao atributo _data em vez de ao getter data. Aqui está como você pode corrigir isso:

get data(): Date {
    const data = new Date(this._data.getTime())
    return data
}

Assim, você está criando uma nova data a partir do atributo _data, evitando a recursão infinita. Veja se é isso mesmo e corrija por favor. Qualquer coisa manda aqui de novo.

Espero ter ajudado e bons estudos!

Era isso mesmo obrigado!

Eu tinha esquecido de acrescentar o _ em data.