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 в том, что хранилище
// объектов *по-настоящему* просто использовать.
// Следующая строка добавляет запись:
Поделиться с друзьями: