Чтение онлайн

ЖАНРЫ

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

{ keyPath: "zipcode" });

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

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

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

store.createlndex("cities", "city");

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

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

//

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

//

// 02130,Jamaica Plain,MA.42.309998,-71.11171

// 02131,Roslindale,MA,42.284678,-71.13052

// 02132,West Roxbury.MA,42.279432,-71.1598

// 02133,Boston,MA,42.338947,-70.919635

// 02134,Allston,MA, 42.355147,-71.13164

//

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

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

// с сайта: http://mappinghacks.com/2008/04/28/civicspace-zip-code-database/

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

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

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

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

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

xhr.send; // Запустить немедленно

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

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

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

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

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

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

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

var lastNewline = xhr.responseText.lastIndexOf("\n");

if (lastNewline > lastChar) {

var chunk = xhr.responseText.substring(lastChar, lastNewline)

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

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

var lines = chunk.split("\n”);

numlines += lines.length;

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

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

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

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

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

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

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

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

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

var transaction = db.transaction(["zipcodes’'], // хранилища

IDBTransaction.READ_WRITE);

// Получить ссылку на хранилище из объекта транзакции

var store = transaction.objectStore("zipcodes");

// Теперь обойти в цикле строки в файле с почтовыми индексами,

// создать на их основе объекты и добавить их в хранилище.

for(var і = 0; і < lines.length; i++) {

var fields = lines[i].split(",");// Значения через запятую

var record = { // Сохраняемый объект

zipcode: fields[0], // Все свойства - строки

city: fields[1],

state: fields[2],

latitude: fields[3],

longitude: fields[4]

};

// Вся прелесть IndexedDB API в том, что хранилище

// объектов *по-настоящему* просто использовать.

// Следующая строка добавляет запись:

Поделиться с друзьями: