Ошибка при вводе данных в базу данных в IndexedDb - PullRequest
0 голосов
/ 30 марта 2019

Когда я пытаюсь вставить данные, я получаю следующую ошибку:

"Uncaught DOMException: не удалось выполнить 'put' для 'IDBObjectStore': Транзакция завершена. "

Мой код:


request.onsuccess = function(e) {
  var ip="kaka";
  var res;
  console.log("success");
  db = request.result;
  tx = db.transaction("List","readwrite");
  store = tx.objectStore("List");
  index = store.index("Name");

  displayData(function oncompleted(value) {
    console.log('The value is', value);
    store.put({
      Name: $('#card').val(), IP: value
    });            
  });
}

function displayData(myCallbackFunction) {
  //code
  myCallbackFunction(set);
}

1 Ответ

2 голосов
/ 30 марта 2019

Эта ошибка означает, что ваша транзакция уже завершена до вашего store.put вызова.В IndexedDB транзакции фиксируются автоматически :

Транзакции очень тесно связаны с циклом событий.Если вы совершите транзакцию и вернетесь в цикл обработки событий, не используя ее, транзакция станет неактивной.Единственный способ сохранить активную транзакцию - сделать запрос на нее.Когда запрос будет завершен, вы получите событие DOM и, предположив, что запрос выполнен, у вас будет еще одна возможность продлить транзакцию во время этого обратного вызова.Если вы вернетесь в цикл обработки событий без расширения транзакции, она станет неактивной и т. Д.Пока есть ожидающие запросы, транзакция остается активной.Время жизни транзакции действительно очень простое, но привыкание может занять некоторое время.Еще несколько примеров тоже помогут.Если вы начинаете видеть TRANSACTION_INACTIVE_ERR коды ошибок, значит вы что-то напутали.

По сути это означает, что вы не можете выполнять другие несвязанные асинхронные операции, а затем делать запрос на транзакцию.

Глядя на ваш код, это не должно быть проблемой, потому что displayData синхронно вызывает myCallbackFunction.Я предполагаю, что код, который вы разместили, является лишь упрощенным примером, а не реальным кодом, который выдает ошибку.В вашем реальном коде displayData, вероятно, выполняет асинхронный обратный вызов.

...