Я работаю с веб-страницей, на которой есть вкладки, которые просто скрывают все, кроме выбранной вкладки, используя свойство стиля display
. Когда выбирается новая вкладка, вызывается функция, которая собирает некоторые данные со страницы и записывает их в хранилище объектов indexedDB, которое будет использоваться для восстановления предыдущего состояния вкладки, такого как выбранный элемент и положение курсора, ни одна из которых Кажется эффективным сохранять при каждом отдельном изменении.
В то же время важные данные сохраняются сразу, например, событие change
в текстовой области, которое записывает данные в то же хранилище объектов, что и выше.
Мой вопрос заключается в том, что должно происходить, когда пользователь записывает новый текст в один из элементов текстовой области и, в то время как текстовая область по-прежнему имеет фокус, нажимает кнопку для перехода от вкладки (не вкладки браузера, а только вкладки). отображать на веб-странице)? Это однопользовательское действие запускает две транзакции записи в базу данных в одно и то же время и в одном и том же хранилище объектов.
В ходе тестирования я пытался поместить большой объем данных в текстовое поле перед тем, как отойти от этой вкладки, пытаясь заставить событие записи change
занять больше времени; но транзакция записи, инициированная событием change
, всегда завершается до того, как событие захватит последнее состояние вкладки.
Причиной этого может быть то, что, кроме последней позиции прокрутки, все данные берутся из объекта dataset
небольшого числа элементов HTML, и этот шаг может занять больше времени, прежде чем транзакция будет даже открыта.
Однако я хотел бы чувствовать себя более уверенным в том, что это закодировано как можно ближе к «отказоустойчивости», и хотел бы знать, как предотвратить эти две транзакции, когда-либо блокировать или вмешиваться каким-либо образом, приводящим к потере сбой данных или программы.
Я действительно не знаю, что предоставить для примера кода, потому что нечего показывать, кроме элемента textarea с событием change
и набора переключателей, также с событием изменения, которое вызывает функцию для Соберите данные и откройте транзакцию записи, прежде чем скрывать одну вкладку и показывать другую.
Все работает и еще не вышло один раз, но как я могу его кодировать, чтобы быть уверенным?
Спасибо.
Добавление После долгих мучений я думаю, что неправильно понял концепцию блокировки в indexedDB. Я просто предположил, что это связано с двумя транзакциями записи, пытающимися выполнить запись в одно и то же хранилище объектов одновременно, но после прочтения я не думаю, что это так. Если я правильно понимаю, этот документ MDN гласит, что транзакции обрабатываются в том порядке, в котором они появляются в коде, и пример - две транзакции записи.
Таким образом, для моего вопроса о change
событии, инициирующем транзакцию записи в то же время, когда запускается другая транзакция записи, может показаться, что единственная проблема состоит в том, что одна транзакция перезаписывает данные, записанные другой транзакцией , Браузер будет обрабатывать все остальное, и мне не нужно беспокоиться о вмешательстве или блокировке транзакций, за исключением их порядка, когда это важно. Похоже, что блокировка связана с изменением версии в открытой базе данных.
Что касается моего первоначального вопроса, то событие change
всегда завершалось первым при тестировании, потому что его транзакция всегда открывалась первой, так как оно запускается, я полагаю, в событии blur
в textarea
, которое происходит до * 1037. * событие на переключателях, которое срабатывает при mouseup
, вызывая вторую транзакцию записи. Я предполагаю, что вторая транзакция записи, открытая в том же хранилище объектов, не начнется, пока не завершится первая; но в указанном документе нет такого уровня описания, кроме как ниже.
После выполнения кода хранилище объектов должно содержать значение «2», так как trans2 должен запускаться после trans1.
Дело в том, что даже если первая транзакция записи занимает значительно больше времени по сравнению со второй, вторая не начнется до тех пор, пока не завершится первая, и единственное беспокойство вызывает вторая транзакция, которая потенциально перезаписывает данные, записанные в первой.
Иногда я запутываюсь и создаю проблемы там, где их нет, а кодировщики браузера уже позаботились об этом.
Если я все еще не понимаю, я был бы признателен за исправление. Спасибо.