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

<b>    // city: &quot;Allston&quot;,</b>

<b>    // state: &quot;MA&quot;,</b>

<b>    // latitude: &quot;42.355147&quot;,</b>

<b>    // longitude: '-71.13164”</b>

<b>    // }</b>

<b>    //</b>

<b>    // Свойство &quot;zipcode&quot; используется в качестве ключа базы данных</b>

<b>    // Кроме того, создается индекс по названию города</b>

<b>    // Создать хранилище объектов, указав имя хранилища и объект с параметрами,</b>

<b>    // включающий &quot;путь к ключу&quot;, определяющий имя свойства-ключа для этого</b>

<b>    // хранилища. (Если опустить путь к ключу, IndexedDB определит свой</b>

<b>    // собственный уникальный целочисленный ключ.)</b>

<b>    var store = db.createObjectStore(&quot;zipcodes&quot;, // имя хранилища</b>

<b>                                 { keyPath: &quot;zipcode&quot; });</b>

<b>    // Создать в хранилище объектов индекс по названию города.</b>

<b>    // Строка пути к ключу передается этому методу непосредственно,</b>

<b>    // как обязательный аргумент, а не как свойство объекта с параметрами,</b>

<b>    store.createlndex(&quot;cities&quot;, &quot;city&quot;);</b>

<b>    // Теперь необходимо загрузить информацию о почтовых индексах, преобразовать</b>

<b>    // ее в объекты и сохранить эти объекты в созданном выше хранилище.</b>

<b>    //</b>

<b>    // Файл с исходными данными содержит строки следующего вида:</b>

<b>    //</b>

<b>    // 02130,Jamaica Plain,MA.42.309998,-71.11171</b>

<b>    // 02131,Roslindale,MA,42.284678,-71.13052</b>

<b>    // 02132,West Roxbury.MA,42.279432,-71.1598</b>

<b>    // 02133,Boston,MA,42.338947,-70.919635</b>

<b>    // 02134,Allston,MA, 42.355147,-71.13164</b>

<b>    //</b>

<b>    // Как ни странно, но почтовая служба США не обеспечивает свободный доступ</b>

<b>    // к этой информации, поэтому мы будет использовать устаревшие данные переписи</b>

<b>    // с сайта: </b><a href="http://mappinghacks.com/2008/04/28/civicspace-zip-code-database/"><b>http://mappinghacks.com/2008/04/28/civicspace-zip-code-database/</b></a>

<b>    // Для загрузки данных используется объект XMLHttpRequest.</b>

<b>    // Но для обработки данных по мере поступления будут использованы</b>

<b>    // новые события onload и onprogress, определяемые спецификацией XHR2</b>

<b>    var xhr = new XMLHttpRequest();  // Объект XHR для загрузки данных</b>

<b>    xhr.open(&quot;GET&quot;, &quot;zipcodes.csv&quot;); // HTTP-запрос типа GET для этого URL</b>

<b>    xhr.send();                      // Запустить немедленно</b>

<b>    xhr.oneг гог = status;           // Отображать сообщения об ошибках</b>

<b>    var lastChar = 0, numlines = 0;  // Уже обработанный объем</b>

<b>    // Обрабатывает файл базы данных блоками, по мере загрузки</b>

<b>    xhr.onprogress = xhr.onload = function(e) { // Сразу два обработчика!</b>

<b>      // Обработать блок между lastChar и последним принятым символом</b>

<b>      // перевода строки. (Нам требуется отыскать последний символ</b>

<b>      // перевода строки, чтобы не обработать неполную запись)</b>

<b>      var lastNewline = xhr.responseText.lastIndexOf(&quot;\n&quot;);</b>

<b>      if (lastNewline &gt; lastChar) {</b>

<b>        var chunk = xhr.responseText.substring(lastChar, lastNewline)</b>

<b>        lastChar = lastNewline + 1; // Откуда начинать в следующий раз</b>

<b>        // Разбить новый фрагмент на строки</b>

<b>        var lines = chunk.split(&quot;\n”);</b>

<b>        numlines += lines.length;</b>

<b>        // Чтобы вставить информацию о почтовом индексе в базу данных, необходимо</b>

<b>        // получить объект транзакции. Все операции добавления объектов</b>

<b>        // в базу данных, выполняемые с использованием этого объекта,</b>

<b>        // будут автоматически подтверждаться после выхода из этой функции,</b>

<b>        // когда броузер вернется в цикл обработки событий.</b>

<b>        // Чтобы создать объект транзакции, следует определить,</b>

<b>        // какие хранилища объектов будут использоваться (у нас имеется всего</b>

<b>        // одно хранилище). Кроме того, требуется сообщить, что будет</b>

<b>        // выполняться не только чтение, но и запись в базу данных:</b>

<b>        var transaction = db.transaction([&quot;zipcodes’'], // хранилища</b>