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:
:)