Я пытаюсь сохранить данные с одной вкладки в indexeddb и попытаться получить данные с другой вкладки. Но операция выполняется во второй вкладке, только когда я закрываю первую вкладку или закрываю indexeddb на первой вкладке, используя indexeddb.close();
Как получить данные из indexeddb из других вкладок (без закрытия первой вкладки или экземпляра indexeddb на первой вкладке)?
Данные, хранящиеся в indexedDB, доступны для всех вкладок из одного источника. Сначала уточните, что обе вкладки указывают на одно и то же происхождение.
Тем не менее, indexedDB блокирует доступ к своим данным по существу по одной вкладке за раз. Если у вас есть подключение к базе данных indexedDB, открытое на одной вкладке и попытка открыть соединение с одной и той же базой данных на второй вкладке, второе соединение останавливается, потому что оно заблокировано открытым соединением на другой вкладке.
Обратите внимание, что я говорю о киосках, не терпит неудачу. Это связано с тем, что соединение в конечном итоге будет успешным (оно будет разблокировано) после того, как вкладка с открытым соединением закроет соединение. Событие успеха при попытке открыть соединение в конечном итоге загорится после его разблокировки.
Соединение можно закрыть, вызвав IDBDatabase.prototype.close в открытом соединении или просто закрыв вкладку.
Один из способов избежать некоторого нежелательного поведения и минимизировать, как часто происходит заблокированное событие, - избегать использования глобального подключения к базе данных. По глобальному я имею в виду соединение с базой данных, которое вы открываете некоторое время около момента открытия вкладки, когда dom загружается и т.д., А затем остается открытым для оставшейся части срока действия вкладки. Вместо того, чтобы открывать соединение один раз на протяжении всего срока действия вкладки, откройте соединение только тогда, когда оно вам понадобится, а затем закройте его и снова заново подключите каждое дополнительное время, когда оно вам понадобится, и закройте его после этого. Таким образом, соединение закрывается в течение большей части времени, когда вкладка открыта, а не открыта в большинстве случаев.
Со всем этим предлогом ответ на ваш вопрос:
Обратите внимание на "заблокированное" событие. Добавьте слушателя в tab2, который его прослушивает. Если вы являетесь свидетелем этого события, то вы попытались подключиться в tab2, пока соединение tab1 все еще открыто. Измените ваше приложение, чтобы иметь возможность реагировать на эту ситуацию.
Вот упрощенный пример прослушивания заблокированного события:
function open(name, version, callback) {
var request = indexedDB.open(name, version);
request.onsuccess = function(event) {
var db = request.result;
callback(result, null);
};
request.onerror = function(event) {
console.log('Failed to connect');
callback(null, 'error');
};
request.onblocked = function(event) {
console.log('Failed to connect because blocked');
callback(null, 'blocked');
};
}
open('foo', 1, function onopen(db, error) {
if(error === 'error') {
console.log('cannot do stuff because of error');
} else if(error === 'blocked') {
console.log('cannot do stuff because blocked');
} else {
console.log('do stuff with db', db.name);
// do db operation here
// cleanup when done
db.close();
}
});