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

quanto ocorrem as chamadas dos métodos sobreescritos em JS?

Olá,

Sou programador java e estou com uma duvida sobre a sequencia de execução do JS. Tirei esse bloco do curso Java Script Avançado III, Aula 3, Atividade 4.

Minha duvida é: se na primeira parte do bloco eu já estou chamando o método clear(), porque que eu só reescrevo o onsucess() depois de chamar o clear() ?

Se fosse em Java eu teria que primeiro reescrever o onsucess() e o onerror() para depois chamar o clear().

Estou confuso de como funciona as chamadas dos métodos internamente no JavaScript

apagaTodos() {
    let request = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear();

    request.onsuccess = e => resolve('Negocioações removidas com sucesso');

    request.onerror = e => {
        console.log(e.target.error);
        reject('Não foi possivel remover as negociações');
    };
}
6 respostas

Porque JavaScript executa essa operação assíncronamente. Você diz o que precisa ser feito e no final precisa saber se a operação foi bem sucedida. Esse teste é feito no callback de onsucces.

Tipo

let request = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear();

Aqui já apagou ou não. Porque é assíncrono. Você terá certeza no callback passado para request.onsuccess.

Muito obrigado!!!

Entendi, mas existe o risco de ele executa o clear() antes de executar o onsuccess() que eu vou sobreescrever na lina abaixo ? ou o Java script só starta a thread depois que eu sobreescrever os métodos onsuccess() e onerror() ?

solução!

Para te ajudar a compreender melhor, vou entrar um pouquinho mais técnico aqui:

let request = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear();

Esse código é assíncrono, certo? Vai rodar em paralelo no seu código mesmo o JavaScript sendo single thread porque quem vai executar não é o runtime do JavaScript, é o browser, porque o IndexedDB vive no browser. O JavaScript solicita ao clear ao IndexeDB que vive no Browser e o browser fará isso usando uma nova thread ou não, você nunca vai saber. Mas sabe que o código não bloqueará sua única thread do JavaScript.

Mas tem um detalhe aqui! Esse código, internamente, foi programado para executar no próximo event tick do event loop do JavaScript.

Como JavaScript é single thread, ele possui um loop infinito que resumindo a história fica executando seu código. Quando digo próximo tick, é o próximo loop.

Então, quando você vê:

let request = this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear();
request.onsuccess = () => console.log('deu certo');

Essas duas instruções foram executadas na sua pilha de execução, mas o clear será chamado apenas no próximo tick. Se é no próximo tick, você já tem o callback que deseja chamar quando seu código for executado. Então ele faz o clear e depois se deu certo ou não chama seu callback.

O indexedDB é meio atípico, acho que você entenderia melhor se ele fosse assim:

this._connection
        .transaction([this._store], 'readwrite')
        .objectStore(this._store)
        .clear(() => console.log('sucesso'), ()=> console.log('erro'));

No exemplo hipotético, o clear recebe o callback de sucesso e o callback de erro.

Consegui ir mais além ou só compliquei?

Nossa!! Perfeita a explicação!!

Muitíssimo obrigado. Acho q agora eu consigo enxergar melhor como é o funcionamento interno do JS (pensar que as coisas estavam sendo executadas fora de sequência já estava me deixando louco).

Só uma observação:

Suas aulas são excelentíssimas!!! Gosto Muito do conteúdo que você tem produzido.

Obrigado pelo retorno Gabriel! Fico contente de poder ajudar. Como JavaScript é assíncrono e não bloqueante complica mesmo.

Sucesso e bom estudo meu aluno!