You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// это событие не должно срабатывать, если мы правильно обрабатываем onversionchange
// этот обработчик не будет вызван, если мы правильно обрабатываем событие versionchange
// это означает, что есть ещё одно открытое соединение с той же базой данных
// и он не был закрыт после того, как для него сработал db.onversionchange
// и оно не было закрыто после возникновения события versionchange
};
*/!*
```
...Другими словами, здесь мы делаем две вещи:
1. Обработчик `db.onversionchange` сообщает нам о попытке параллельного обновления, если текущая версия базы данных устарела.
2. Обработчик `OpenRequest.onblocked` сообщает нам об обратной ситуации: в другом месте есть соединение с устаревшей версией, и оно не закрывается, поэтому новое соединение установить невозможно.
2. Обработчик `openRequest.onblocked` сообщает нам об обратной ситуации: в другом месте есть соединение с устаревшей версией, и оно не закрывается, поэтому новое соединение установить невозможно.
Мы можем более изящно обращаться с вещами в `db.onversionchange`, например предлагать посетителю сохранить данные до закрытия соединения и так далее.
Или альтернативным подходом было бы не закрывать базу данных в `db.onversionchange`, а вместо этого использовать обработчик `onblocked` (на новой вкладке), чтобы предупредить посетителя, что более новая версия не может быть загружена, пока они не закроют другие вкладки.
Или альтернативным подходом было бы не закрывать базу данных в `db.onversionchange`, а вместо этого использовать обработчик `onblocked` (на новой вкладке), чтобы предупредить посетителя, что более новая версия не может быть загружена, пока он не закроет другие вкладки.
Такой конфликт при обновлении происходит редко, но мы должны как-то его обрабатывать, хотя бы поставить обработчик `onblocked`, чтобы наш скрипт не "умирал" молча, удивляя посетителя.
Это отменит все изменения, сделанные запросами в транзакции, и сгенерирует событие `transaction.onabort`.
Это отменит все изменения, сделанные запросами в транзакции, и сгенерирует событие `abort`.
## Обработка ошибок
Expand DownExpand Up
@@ -668,7 +668,7 @@ let request = store.openCursor([query], [direction]);
- `"prev"` -- обратный порядок: от самого большого ключа к меньшему.
- `"nextunique"`, `"prevunique"` -- то же самое, но курсор пропускает записи с тем же ключом, что уже был (только для курсоров по индексам, например, для нескольких книг с price=5, будет возвращена только первая).
**Основным отличием курсора является то, что `request.onsuccess` генерируется многократно: один раз для каждого результата.**
**Основным отличием курсора является то, что обработчик `request.onsuccess` вызывается многократно: один раз для каждого результата.**
Вот пример того, как использовать курсор:
Expand DownExpand Up
@@ -760,21 +760,20 @@ try {
Если мы не перехватим ошибку, то она "вывалится" наружу, вверх по стеку вызовов, до ближайшего внешнего `try..catch`.
Необработанная ошибка становится событием "unhandled promise rejection" в объекте `window`.
Необработанная ошибка приводит к возникновению события `unhandledrejection` (unhandled promise rejection) на объекте `window`.
let request = event.target; // объект запроса IndexedDB
let error = event.reason; // Необработанный объект ошибки, как request.error
let error = event.reason; // Объект ошибки, из-за которой отклонён промис
...сообщить об ошибке...
});
```
### Подводный камень: "Inactive transaction"
Как мы уже знаем, транзакции автоматически завершаются, как только браузер завершает работу с текущим кодом и макрозадачу. Поэтому, если мы поместим *макрозадачу* наподобие `fetch` в середину транзакции, транзакция не будет ожидать её завершения. Произойдёт автозавершение транзакции. Поэтому при следующем запросе возникнет ошибка.
Как мы уже знаем, транзакции автоматически завершаются, как только браузер заканчивает выполнение текущего синхронного кода и микрозадач. Поэтому, если мы поместим *макрозадачу* наподобие `fetch` в середину транзакции, транзакция не будет ожидать её завершения. Произойдёт автозавершение транзакции. Поэтому при следующем запросе возникнет ошибка.
Для промисифицирующей обёртки и `async/await` поведение такое же.
Expand Down
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.