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

ЖАНРЫ

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

data[i+1] = (data[i+1] + data[i-3]*m)/n; // Зеленая

data[i+2] = (data[i+2] + data[i-2]*m)/n; // Синяя

data[i+3] = (data[i+3] + data[i-1]*m)/n; // Альфа-составляющая

}

}

return pixels;

}

Обратите внимание, что программный код в примере 22.7 может обрабатывать любое количество изображений, которые будут отправлены ему. Однако для простоты пример 22.6 создает

новый объект
Worker
для обработки каждого изображения. Чтобы не плодить фоновые потоки, которые ничего не делают в ожидании новых сообщений, по завершении обработки изображения работа фонового потока завершается вызовом метода
terminate.

Следующий пример демонстрирует, как с помощью фоновых потоков выполнения можно писать синхронный программный код и безопасно использовать его в клиентских сценариях на языке JavaScript. В разделе 18.1.2.1 было показано, как с помощью объекта

XMLHttpRequest
выполнять синхронные НТТР-запросы, и говорилось, что такой способ его использования в основном потоке выполнения является не лучшим решением. Однако в фоновом потоке вполне оправданно выполнять синхронные запросы, и в примере 22.8 демонстрируется реализация фонового потока выполнения, которая выполняет именно такие запросы. Его обработчик события
onmessage
принимает массив URL-адресов, использует синхронный прикладной интерфейс объекта
XMLHttpRequest
для извлечения их содержимого и затем посылает полученное текстовое содержимое в виде массива строк обратно основному потоку выполнения. Или, если какой-либо HTTP-запрос потерпит неудачу, возбуждает исключение, которое распространится до обработчика
onerror
объекта
Worker
.

Отладка фоновых потоков выполнения

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

WorkerGlobalScope
(по крайней мере, на момент написания этих строк), является прикладной интерфейс доступа к консоли и одна из самых ценных его функций -
console.log.
Фоновые потоки не могут выводить текст в консоль и вообще не могут взаимодействовать с документом, поэтому их отладка может оказаться весьма трудным делом. Если фоновый поток возбудит исключение, основной поток получит событие «error» в объекте
Worker
. Но чаще бывает необходимо иметь в фоновом потоке хоть какой-нибудь способ выводить отладочные сообщения, которые будут видимы в веб-консоли броузера. Один из самых простых способов добиться этого - изменить протокол передачи сообщений, используемый для взаимодействия с фоновым потоком, чтобы он мог посылать отладочные сообщения. Так, в примере 22.6 можно было бы вставить следующий программный код в начало обработчика событий
onmessage
:

if (typeof e.data === "string") {

console.log("Worker: " + e.data):

return:

}

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

postMessage
.

*******************************************

Пример 22.8. Выполнение синхронных HTTP-запросов в фоновом потоке

// Этот файл будет загружен вызовом конструктора Worker, поэтому он будет выполняться

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

// интерфейс объекта XMLHttpRequest. В качестве сообщения фоновому потоку должен

// передаваться массив URL-адресов. Поток синхронно извлечет содержимое

// из указанных адресов и вернет его в виде массива строк,

onmessage = function(e) {

var urls = e.data; // Входные данные: URL-адреса извлекаемого содержимого

var contents = []; // Выходные данные: содержимое указанных URL-адресов

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

var url = urls[i]; // Для каждого URL-адреса

var xhr = new XMLHttpRequest; // Создать HTTP-запрос

xhr.open("GET'', url, false); // false обеспечит синхронное выполн.

xhr.send; // Блокируется до выполнения запроса

if (xhr.status !== 200) // Возбудить исключение при неудаче

throw Error(xhr.status + " " + xhr.statusText + ": + url);

contents.push(xhr.responseText); // Иначе сохранить содержимое

}

// Отослать массив содержимого URL-адресов обратно основному потоку

postMessage(contents);

}

22.5. Типизированные массивы и буферы

Как говорилось в главе 7, массивы в языке JavaScript являются многоцелевыми объектами с числовыми именами свойств и специальным свойством

length
. Элементами массива могут быть любые JavaScript-значения. Массивы могут увеличиваться и уменьшаться в размерах и быть разреженными. Реализации JavaScript выполняют множество оптимизаций, благодаря которым типичные операции с массивами в языке JavaScript выполняются очень быстро. Типизированные массивы - это объекты, подобные массивам (раздел 7.11), которые имеют несколько важных отличий от обычных массивов:

• Все элементы типизированного массива являются числами. Конструктор, используемый для создания массива, определяет тип (целые числа со знаком или без знака или вещественные числа) и размер (в битах) чисел.

• Типизированные массивы имеют фиксированную длину.

• Элементы типизированного массива всегда инициализируются значением 0 при его создании.

Всего существует восемь разновидностей типизированных массивов, каждый с различным типом элементов. Создавать их можно с помощью следующих конструкторов:

При создании типизированного массива конструктору передается размер массива. Вместо размера можно передать массив или типизированный массив, который будет использован для инициализации элементов нового массива. После создания типизированного массива его элементы можно читать или изменять с помощью обычной формы записи с квадратными скобками, как и при работе с любым другим объектом, подобным массиву:

var bytes = new Uint8Array(1024); // Один килобайт байтов

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