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

onsuccess x oncomplete

Item 3.09 - enquanto lia o exemplo, resolvi fazer o seguinte teste:

adiciona(negociacao) {

        return new Promise((resolve, reject) => {
            let transaction = this._connection
                .transaction([this._store], 'readwrite');

            let request = transaction
                .objectStore(this._store)
                .add(negociacao);

            request.onsuccess = e => {
                resolve();
        //sim, um abort logo depois de o evento onsucess ser chamado
                transaction.abort();
            }

            request.onerror = e => {
                console.log(e.target.error);
                reject('Não foi possível adicionar a negociação');
            }
        });
    }

O resultado foi divertido: - nenhuma linha foi adicionada no indexed db - a linha atualizou o model

Notei que o onsucess aceita um transaction.abort(), então procurei por alguns exemplos no stack overflow, e cheguei ao seguinte teste

adiciona(negociacao) {

        return new Promise((resolve, reject) => {
            let transaction = this._connection
                .transaction([this._store], 'readwrite');

            let request = transaction
                .objectStore(this._store)
                .add(negociacao);

            request.onsuccess = e => {
                console.log('success');
            }

            transaction.onabort = e => {
                console.log(e);
                console.log('Transação abortada');
            };

            transaction.oncomplete = e => {
                transaction.abort();
                console.log('complete')
                resolve();
            }

            request.onerror = e => {
                console.log(e.target.error);
                reject('Não foi possível adicionar a negociação');
            }
        });
    }

o resultado é interessante: - o console loga success - o dado é persistido - é lançado o erro:

NegociacaoDao.js:29 Uncaught DOMException: Failed to execute 'abort' on 'IDBTransaction': The transaction has finished.

Fiz mais algumas permutações, mas deu pra concluir que o onsucess sinaliza a finalização da requisição ao banco, enquanto o oncomplete sinaliza que a transação já foi escrita no banco.

Pode parecer parnóico, mas parece interessante fazermos uso do oncomplete quando também utilizamos o abort em uma operação:

:)

1 resposta
solução!

Oi Eric! Obrigado por compartilhar seus achados. Não há nada de paranóico não.

É bom que fica aqui no fórum para que outras pessoas possam ver o quanto vale a pena realizar testes para verificar até onde determinada API vai.

Sucesso e bom estudo meu aluno!