JavaScript. Подробное руководство, 6-е издание, стр. 399

Пример 22.15. База данных IndexedDB с почтовыми индексами США

<b>&lt;!DOCTYPE html&gt;</b>

<b>&lt;html&gt;</b>

<b>&lt;head&gt;</b>

<b>&lt;title&gt;Zipcode Database&lt;/title&gt;</b>

<b>&lt;script&gt;</b>

<b>// Реализации IndexedDB все еще используют префиксы в именах</b>

<b>var indexedDB = window.indexedDB || // Использовать стандартный API БД </b>

<b>window.mozIndexedDB || // Или раннюю версию в Firefox</b>

<b>window.webkitlndexedDB; // Или раннюю версию в Chrome</b>

<b>// В Firefox не используются префиксы для следующих двух объектов:</b>

<b>var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;</b>

<b>var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;</b>

<b>// Эта функция будет использоваться для вывода сообщений об ошибках</b>

<b>function logerr(e) {</b>

<b>  console.log(&quot;Ошибка IndexedDB &quot; + e.code + &quot;: &quot; + e.message);</b>

<b>}</b>

<b>// Эта функция асинхронно получает объект базы данных (при необходимости</b>

<b>// создает и инициализирует базу данных) и передает его функции f().</b>

<b>function withDB(f) {</b>

<b>  var request = indexedDB.open(&quot;zipcodes&quot;); // Открыть базу данных zipcode</b>

<b>  request.onerгог = logerr; // Выводить сообщения об ошибках</b>

<b>  request.onsuccess = function() { // Или вызвать эту функцию по завершении</b>

<b>    var db = request.resu.lt; // Результатом запроса является база данных</b>

<b>    // Базу данных можно открыть всегда, даже если она не существует.</b>

<b>    // Мы проверяем версию, чтобы узнать, была ли БД создана и инициализирована.</b>

<b>    // Если нет - это необходимо сделать. Но если БД уже настроена,</b>

<b>    // остается просто передать ее функции f().</b>

<b>    if (db.version === &quot;1&quot;) f(db); // Если БД существует, передать ее f()</b>

<b>    else initdb(db,f); // Иначе сначала инициализировать ее</b>

<b>  }</b>

<b>}</b>

<b>// Принимает почтовый индекс, отыскивает город, которому он принадлежит,</b>

<b>// и асинхронно передает название города указанной функции,</b>

<b>function lookupCity(zip, callback) {</b>

<b>  withDB(function(db) {</b>

<b>    // Создать объект транзакции для этого запроса</b>

<b>    var transaction = db.transaction([&quot;zipcodes&quot;], </b>
<b> // Требуемое хранилище </b>

<b>                    IDBTransaction.READ_0NLY,       // He обновлять</b>

<b>                    0);                             // Время ожидания не ограничено</b>

<b>    // Получить хранилище объектов из транзакции</b>

<b>    var objects = transaction.objectStoreC'zipcodes&quot;);</b>

<b>    // Запросить объект, соответствующий указанному индексу.</b>

<b>    // Строки выше выполнялись синхронно, но эта выполняется асинхронно</b>

<b>    var request = objects.get(zip);</b>

<b>    request.onerror = logerr; // Выводить сообщения об ошибках</b>

<b>    request.onsuccess = function() { // Передать результаты этой функции</b>

<b>                    // Искомый объект сейчас в свойстве request.result</b>

<b>      var object = request.result;</b>

<b>      if (object) // Если cootb. найдено, передать город и штат функции</b>

<b>        callback(object.city + &quot;, &quot; + object.state);</b>

<b>      else // Иначе сообщить о неудаче</b>

<b>        callback(&quot;Неизвестный индекс&quot;);</b>

<b>    }</b>

<b>  });</b>

<b>}</b>

<b>// По указанному названию города отыскивает все почтовые индексы для всех</b>

<b>// городов (в любом штате) с этим названием (с учетом регистра символов).</b>

<b>// Асинхронно передает результаты по одному указанной функции</b>

<b>function lookupZipcodes(city, callback) {</b>

<b>  withDB(function(db) {</b>

<b>    // Как и выше, создаем транзакцию и получаем хранилище объектов</b>

<b>    var transaction = db.transaction([&quot;zipcodes&quot;], IDBTransaction.READ_0NLY, 0);</b>

<b>    var store = transaction.objectStoreC'zipcodes&quot;);</b>