Не удалось выполнить 'put' для 'IDBObjectStore': транзакция завершена - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь обновить запись в моем простом в использовании приложении с indexedDB, однако я получаю Не удалось выполнить 'put' для 'IDBObjectStore': транзакция завершена.

Я не могу понять, почему она не завершит sh транзакцию, я попробовал отладчик, и он останавливается на этой строке: var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id)) Пожалуйста, посмотрите фрагмент, который я включил ниже. Для дополнительного создания контекста, чтения и удаления работы просто отлично, это просто обновление данных, с которыми у меня возникают проблемы

. Я также попытался реализовать метод openCursor, который я получил от Mozilla, который я прокомментировал, так как он также не работает. не работает (у меня такое же поведение) Проверьте мой репо, я знаю, что он все еще очень грязный: (* ​​1009 *

const request = window.indexedDB.open("toDoList", 2);
var db;

request.onsuccess = function (event) {
  console.log("check out some data about our opened db: ", request.result);
  db = event.target.result; // result of opening the indexedDB instance "toDoList"
  getTasks(); //just a function to retrieve data
};

$(document).on("click", ".editBtn", function () {
  var transaction = db.transaction("tasks", "readwrite");
  var tasksStore = transaction.objectStore("tasks");
  console.log(tasksStore);
  let taskId = $(this).attr("idNo");

  var requestForItem = tasksStore.get(Number(taskId));
  requestForItem.onsuccess = function () {
    // console.log(requestForItem.result)
    var oldData = requestForItem.result;
    // prepopulate the input
    $(".editInput").val(requestForItem.result.name);

    $(".saveBtn").click(function () {
      requestForItem.result.name = $(".editInput").val().trim()
      console.log( requestForItem.result)
      var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id))
      console.log("-------------", updateNameRequest.transaction) // doesn't get to this line
      updateNameRequest.onerror = function() {
        console.log("something went wrong")
        console.log(updateNameRequest.error)
      };
      updateNameRequest.onsuccess = function() {
        console.log("here")
        $(".editInput").val("")
        getTasks();
      };
    });
  };

1 Ответ

1 голос
/ 22 апреля 2020

Индексированные транзакции БД автоматически фиксируются, когда все запросы выполнены, и больше никаких запросов не было выполнено, пока управление не вернулось к событию l oop. Другими словами, вы можете делать новые запросы в случае успешного или обратного вызова ошибки из предыдущего запроса, но не в других асинхронных обратных вызовах, таких как обработчики событий.

Вам нужно начать новую транзакцию в обработчике кликов, потому что любая предыдущая транзакция будет автоматически подтверждена.

...