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

ЖАНРЫ

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

// и полный список можно будет передать функции callback,

function handleEntries(entries) {

if (entries.length == 0) callback(list); // Операция закончена

else {

// Иначе добавить эти записи в общий список и запросить

// очередную порцию. Объект, подобный массиву, содержит

// объекты FileEntry,
и нам следует получить имя для каждого.

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

var name = entries[i].name; // Получить имя записи

if (entries[i].isDirectory) name += "/"; // Пометить каталоги

list.push(name); // Добавить в список

}

// Получить следующую порцию записей

reader.readEntries(handleEntries, logerr);

}

}

}

}

Работать с файлами и с файловой системой намного проще в фоновых потоках выполнения, где допускается выполнять блокирующие вызовы и можно использовать синхронный прикладной интерфейс. Пример 22.14 определяет те же функции для работы с файловой системой, что и пример 22.13, но использует синхронный прикладной интерфейс, и потому получился намного короче.

Пример 22.14. Синхронный прикладной интерфейс для работы с файловой системой

// Утилиты для работы с файловой системой, использующие синхронный прикладной

// интерфейс, предназначенный для фоновых потоков выполнения

var filesystem = requestFileSystemSync(PERSISTENT, 10*1024*1024);

function readTextFile(name) {

// Получить объект File из объекта FileEntry из корневого DirectoryEntry

var file = filesystem.root.getFile(name).file;

// Использовать для чтения синхронную версию FileReader

return new FileReaderSync.readAsText(file);

}

function appendToFile(name, contents) {

// Получить FileWriter из FileEntry из корневого DirectoryEntry

var writer = filesystem.root.getFile(name, {create:true}).createWriter;

writer.seek(writer.length); // Начать запись с конца файла

var bb = new BlobBuilder // Собрать содержимое в виде объекта Blob

bb.append(contents);

writer.write(bb.getBlob); //
Записать двоичный объект в файл

}

function deleteFile(name) {

filesystem.root.getFile(name).remove;

}

function makeDirectory(name) {

filesystem.root.getDirectory(name. { create: true, exclusive:true });

}

function listFiles(path) {

var dir = filesystem.root;

if (path) dir = dir.getDirectory(path);

var lister = dir.createReader;

var list = [];

do {

var entries = lister.readEntries;

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

var name = entries[i].name;

if (entries[i]. isDirectory) name += list.push(name);

}

} while(entries.length > 0); return list;

}

// Разрешить основному потоку выполнения использовать эти утилиты, посылая сообщения

onmessage = function(e) {

// Сообщение должно быть объектом:

// { function: "appendToFile", args: ["test", "testing, testing"]}

// Вызвать указанную функцию с указанными аргументами и послать сообщение обратно

var f = self[e.data.function];

var result = f.apply(null, e.data.args);

postMessage(result);

};

22.8. Базы данных на стороне клиента

Архитектура веб-приложений традиционно была основана на поддержке HTML, CSS и JavaScript на стороне клиента и базы данных на стороне сервера. Поэтому одним из самых удивительных прикладных интерфейсов, определяемых спецификацией HTML5, является поддержка баз данных на стороне клиента. Это не прикладные интерфейсы доступа к базам данных на стороне сервера, а действительно интерфейсы доступа к базам данных, хранящимся на компьютере клиента и доступным непосредственно из программного кода на языке JavaScript, выполняемого броузером.

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