Использование операции indexeddb в нескольких вкладках

1

Я пытаюсь сохранить данные с одной вкладки в indexeddb и попытаться получить данные с другой вкладки. Но операция выполняется во второй вкладке, только когда я закрываю первую вкладку или закрываю indexeddb на первой вкладке, используя indexeddb.close();

Как получить данные из indexeddb из других вкладок (без закрытия первой вкладки или экземпляра indexeddb на первой вкладке)?

Теги:
indexeddb

1 ответ

0

Данные, хранящиеся в indexedDB, доступны для всех вкладок из одного источника. Сначала уточните, что обе вкладки указывают на одно и то же происхождение.

Тем не менее, indexedDB блокирует доступ к своим данным по существу по одной вкладке за раз. Если у вас есть подключение к базе данных indexedDB, открытое на одной вкладке и попытка открыть соединение с одной и той же базой данных на второй вкладке, второе соединение останавливается, потому что оно заблокировано открытым соединением на другой вкладке.

Обратите внимание, что я говорю о киосках, не терпит неудачу. Это связано с тем, что соединение в конечном итоге будет успешным (оно будет разблокировано) после того, как вкладка с открытым соединением закроет соединение. Событие успеха при попытке открыть соединение в конечном итоге загорится после его разблокировки.

Соединение можно закрыть, вызвав IDBDatabase.prototype.close в открытом соединении или просто закрыв вкладку.

Один из способов избежать некоторого нежелательного поведения и минимизировать, как часто происходит заблокированное событие, - избегать использования глобального подключения к базе данных. По глобальному я имею в виду соединение с базой данных, которое вы открываете некоторое время около момента открытия вкладки, когда dom загружается и т.д., А затем остается открытым для оставшейся части срока действия вкладки. Вместо того, чтобы открывать соединение один раз на протяжении всего срока действия вкладки, откройте соединение только тогда, когда оно вам понадобится, а затем закройте его и снова заново подключите каждое дополнительное время, когда оно вам понадобится, и закройте его после этого. Таким образом, соединение закрывается в течение большей части времени, когда вкладка открыта, а не открыта в большинстве случаев.

Со всем этим предлогом ответ на ваш вопрос:

  1. На первой вкладке откройте соединение, запишите данные, затем закройте соединение.
  2. Без закрытия первой вкладки, затем во второй вкладке, откройте соединение, прочитайте данные, затем закройте соединение.

Обратите внимание на "заблокированное" событие. Добавьте слушателя в 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();
  }
});
  • 5
    Блокировка на одной вкладке применяется только при изменении версии (например, при обновлении или удалении базы данных). Это должно происходить только тогда, когда вашим веб-приложениям необходимо изменить схему данных. Если вы выполняете изменение версии базы данных во время обычного использования базы данных, вы используете API очень необычным способом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню