Как правильно обрабатывать одно действие пользователя, которое запускает два события записи indexedDB в одно и то же хранилище объектов? - PullRequest
2 голосов
/ 10 мая 2019

Я работаю с веб-страницей, на которой есть вкладки, которые просто скрывают все, кроме выбранной вкладки, используя свойство стиля display. Когда выбирается новая вкладка, вызывается функция, которая собирает некоторые данные со страницы и записывает их в хранилище объектов indexedDB, которое будет использоваться для восстановления предыдущего состояния вкладки, такого как выбранный элемент и положение курсора, ни одна из которых Кажется эффективным сохранять при каждом отдельном изменении.

В то же время важные данные сохраняются сразу, например, событие change в текстовой области, которое записывает данные в то же хранилище объектов, что и выше.

Мой вопрос заключается в том, что должно происходить, когда пользователь записывает новый текст в один из элементов текстовой области и, в то время как текстовая область по-прежнему имеет фокус, нажимает кнопку для перехода от вкладки (не вкладки браузера, а только вкладки). отображать на веб-странице)? Это однопользовательское действие запускает две транзакции записи в базу данных в одно и то же время и в одном и том же хранилище объектов.

В ходе тестирования я пытался поместить большой объем данных в текстовое поле перед тем, как отойти от этой вкладки, пытаясь заставить событие записи change занять больше времени; но транзакция записи, инициированная событием change, всегда завершается до того, как событие захватит последнее состояние вкладки.

Причиной этого может быть то, что, кроме последней позиции прокрутки, все данные берутся из объекта dataset небольшого числа элементов HTML, и этот шаг может занять больше времени, прежде чем транзакция будет даже открыта.

Однако я хотел бы чувствовать себя более уверенным в том, что это закодировано как можно ближе к «отказоустойчивости», и хотел бы знать, как предотвратить эти две транзакции, когда-либо блокировать или вмешиваться каким-либо образом, приводящим к потере сбой данных или программы.

Я действительно не знаю, что предоставить для примера кода, потому что нечего показывать, кроме элемента textarea с событием change и набора переключателей, также с событием изменения, которое вызывает функцию для Соберите данные и откройте транзакцию записи, прежде чем скрывать одну вкладку и показывать другую.

Все работает и еще не вышло один раз, но как я могу его кодировать, чтобы быть уверенным?

Спасибо.

Добавление После долгих мучений я думаю, что неправильно понял концепцию блокировки в indexedDB. Я просто предположил, что это связано с двумя транзакциями записи, пытающимися выполнить запись в одно и то же хранилище объектов одновременно, но после прочтения я не думаю, что это так. Если я правильно понимаю, этот документ MDN гласит, что транзакции обрабатываются в том порядке, в котором они появляются в коде, и пример - две транзакции записи.

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

Что касается моего первоначального вопроса, то событие change всегда завершалось первым при тестировании, потому что его транзакция всегда открывалась первой, так как оно запускается, я полагаю, в событии blur в textarea, которое происходит до * 1037. * событие на переключателях, которое срабатывает при mouseup, вызывая вторую транзакцию записи. Я предполагаю, что вторая транзакция записи, открытая в том же хранилище объектов, не начнется, пока не завершится первая; но в указанном документе нет такого уровня описания, кроме как ниже.

После выполнения кода хранилище объектов должно содержать значение «2», так как trans2 должен запускаться после trans1.

Дело в том, что даже если первая транзакция записи занимает значительно больше времени по сравнению со второй, вторая не начнется до тех пор, пока не завершится первая, и единственное беспокойство вызывает вторая транзакция, которая потенциально перезаписывает данные, записанные в первой.

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

Если я все еще не понимаю, я был бы признателен за исправление. Спасибо.

...