// и полный список можно будет передать функции 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); //
Записать двоичный объект в файл
// Вызвать указанную функцию с указанными аргументами и послать сообщение обратно
var f = self[e.data.function];
var result = f.apply(null, e.data.args);
postMessage(result);
};
22.8. Базы данных на стороне клиента
Архитектура веб-приложений традиционно была основана на поддержке HTML, CSS и JavaScript на стороне клиента и базы данных на стороне сервера. Поэтому одним из самых удивительных прикладных интерфейсов, определяемых спецификацией HTML5, является поддержка баз данных на стороне клиента. Это не прикладные интерфейсы доступа к базам данных на стороне сервера, а действительно интерфейсы доступа к базам данных, хранящимся на компьютере клиента и доступным непосредственно из программного кода на языке JavaScript, выполняемого броузером.