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

Salvar negociações importadas no IndexedDB

Realizei uma implementação simples com o intuito de salvar as negociações importadas no indexedDB, tornando-as persistentes também, assim como as negociações inseridas manualmente. Está funcionando corretamente. Gostaria de saber se há alguma forma mais simples de salvar os dados através do NegociacaoDao.adiciona(), sem a necessidade de chamar a ConnectionFactory.getConnection() em toda a transação que for necessário o acesso ao indexedDB, ou se essa é mesmo a forma correta de utilização dessa classe.

Obrigado! Segue código do método abaixo:

  importaNegociacoes() {
    let service = new NegociacaoService();

    service
      .obterNegociacoes()
      .then(negociacoes =>
        negociacoes.filter(negociacao =>
          !this._listaNegociacoes.negociacoes.some(negociacaoExistente =>
            JSON.stringify(negociacao) == JSON.stringify(negociacaoExistente)))
      )
      .then(negociacoes => {
          negociacoes.forEach(negociacao => {
            ConnectionFactory.getConnection()
              .then(connection => {
                new NegociacaoDao(connection)
                  .adiciona(negociacao)
                  .then(() => {
                    this._listaNegociacoes.adiciona(negociacao);
                    this._mensagem.texto = 'Negociações do período importadas com sucesso';
                  })
              })
          })
      })
      .catch(erro => this._mensagem.texto =  erro);
}
3 respostas

Oi Renan, tudo bem? Me parece problemático você por o getConnection e criar o DAO dentro de um forEach, isso indica que pra toda negociação você vai criar uma nova conexão e um novo DAO sendo que você pode usar os dois dentro do laço.

Eu colocaria as instâncias dos objetos fora do laço.

solução!

no meu caso eu modifiquei o cadastra e o NegociacaoDao para receberem uma array de negociações

NegociacaoService.js

  importa(lista) {
    return Promise.all([
      this.obterSemana(),
      this.obterSemanaAnterior(),
      this.obterSemanaRetrasada(),
    ]).then(negociacoes => negociacoes.flat())
      .then(negociacoes => {
        var n = negociacoes.filter(n => !lista.possui(n))
        this.cadastra(...n)
        return n
      })
      .catch(erro => {
        throw new Error(erro)
      })
  }

  cadastra(...negociacoes) {
    return ConnectionFactory
      .getConnection()
      .then(connection => new NegociacaoDao(connection))
      .then(dao => dao.adiciona(...negociacoes))
      .then(() => 'Negociações adicionadas com sucesso')
      .catch(erro => {
        throw new Error(erro)
      })
  }

NegociacaoDao.js

adiciona(...negociacoes) {
  return new Promise((resolve, reject) => {
    if (!negociacoes.length) {
      return
    }

    let request = this._connection
      .transaction([this._store], 'readwrite')
      .objectStore(this._store)
      .add(negociacoes.pop())

    request.onsuccess = () => {
      if (!negociacoes.length) {
        resolve()
      }
      else {
        this.adiciona(...negociacoes)
      }
    }

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

É, também é uma alternativa. Eu preferia criar um segundo método que aceita um array e deleta a chamada, por que essa solução me força a passar sempre um array para salvar.