Выделенный веб -работник (специализированный веб -работник) предоставляет простой способ позволить веб -контенту запускать сценарий в фоновом режиме. Как только работник создан, он может передать сообщение функции мониторинга событий, указанной его создателем, так что все задачи, сгенерированные работником, получат эти сообщения. Рабочий поток может выполнять задачи без интерференционного интерфейса. Кроме того, он также может использовать Xmlhttprequest (хотя два значения атрибута responsexml и канала всегда являются нулевыми) для выполнения операций ввода -вывода. В этой статье приведены примеры и детали для составления предыдущих документов. Функция, предоставленная работнику, перечисляет функции, поддерживаемые работником.
Рабочий интерфейс будет генерировать реальную систему операционной системы. Однако для веб -работника точки связи с другими потоками будут тщательно контролироваться, что означает, что вам трудно вызвать осложнение. У вас нет возможности получить доступ к компонентам безопасности или DOMS. Так что, если вы не тратите на голову, вы не можете совершать ошибки. Генерировать работника
Это очень просто создать нового работника. Все, что вам нужно сделать, это позвонить в конструктор Worker () и указать URI, которому необходимо запустить сценарий, который работает в потоке работника. Конкретная функция обработки событий.
var myWorker = new Worker (my_task.js);
Или вы также можете использовать addEventListener ():
var myWorker = новый работник (my_task.js); Работник.
Первая строка в примере создает новый рабочий поток. Третий акт устанавливает функцию мониторинга события сообщения. Когда работник вызывает собственную функцию Postmessage (), вызывается эта функция обработки событий. Наконец, рабочая нить была запущена в седьмой линии. ПРИМЕЧАНИЕ. URI параметра, который передает рабочую конструктор, должен следовать гомологичной стратегии. В настоящее время различные производители браузеров по -прежнему отличаются от того, какие URI должны следовать гомологичным стратегиям; BLOB URI.
Передавать данныеДанные, передаваемые между домашней страницей и работником, копируются, а не общие. Объект, переданный работнику, должен быть сериализован, а затем следующий конец должен быть сериализован. Страница не имеет того же примера, что и работник. Большинство браузеров используют структурированную копию для достижения этой функции.
Прежде чем уйти вниз, для обучения давайте создадим функцию под названием EmulationMessage ().
Функция EmulationMessage (vval) {return eval; // objectAlert (typeof emulationmessage (пример1); // номер // test #2var example2 = true; Alert (typeOf example2); // booleanAlert (typeof emulationmessage (пример2)); // Boolean // Тест #3V #3V AR Пример 3 = новая строка (Hello World); , Возраст: 43}; VARS5 = Новое животное (CAT, 3);Значение, которое не совместно используется, называется сообщением. Давайте поговорим о работнике, вы можете использовать Postmessage (), чтобы передать сообщение в основной поток или отправить его обратно из основного потока. Атрибут данных события сообщения содержит данные от работника.
Пример.html: (домашняя страница):var myWorker = new Worker (my_task.js); ;
Примечание: вообще говоря, фоновые потоки -включают работник -Unable для управления DOM. Если фоновый поток должен изменить DOM, он должен отправить сообщение своему основателю, чтобы создатель завершил эти операции.
Как вы можете видеть, сообщение, передаваемое между работником и домашней страницей, всегда является «сообщением JSON», даже если оно является исходным типом значения. Следовательно, вы можете передавать данные JSON и/или любой тип данных, который может сериализовать:
Postmessage ({cmd: init, timestamp: date.now ()});Примеры для передачи данных
Пример № 1: Создайте общую "асинхронную eval ()"
В следующем примере представлено, как использовать eval () в работнике для выполнения любого типа кода JavaScript в любом типе асинхронного в порядке ::
// Синтаксис: asynceval (code [, listner]) var asynceval = (function () {var alistener = [], oparser = новый работник (данные: text/javascript; charset = us-asciii, onmessage%20%3d%20 функция. %20%28oevent%29%20%7b%0a%09postmessage%28%7B%09%09%22ID%22%20OVENT.DATA%2C%09%22.%22%3A 3A 3A 3A 3A 3A 3A 3A 3A% 20 Eval%28Oevent.data.code%29%0a%09%7d%29%3b%0a%7d); data.id] (eevent.data.evalicated);} Удалить Alisteners [eevent.data.id];}; : Alisteners.length -1, code: scode});};});Пример использования:
// асинхронное сообщение о оповещениях ... asynceval (3 + 2, function (smessage) {alert (3 + 2 = + smessage); // асинхронная печать ... asynceval (// hello world !!!/,,, функция (Shtml) {document.body.appendchild (document.createtextnode (shtml);}); .open (/get/, /http://www.mozilla.org//, false);/n/toreq.send (null);/n/treturn oreq.responsetext;/n}););););););); );));));));));)));));));)));)));)));)));)));Пример № 2: Передача расширенного метода JSON и создать систему обмена
Если вам нужно передавать очень сложные данные, и вам нужно одновременно вызывать несколько методов на домашней странице и работнике, то вы можете подумать о создании системы, аналогичной следующей.
Пример.html (главная страница): <! Аргумент для передачи 1, аргумент в соответствии с прохождением 2 и т. Д.) Функция): добавляет слушатель * removeListener (имя): удаляет свойства экземпляров Queeryker Queeryker: * Default -Listereler: The Executem Sulder Sliefer только тогда, когда работник вызывает функцию postmessage () напрямую */ function QueryableWorker (surl, fdeflistener, fonerror) {var QuerdableWorker (SURL, fdeflistener, fonerror) {var) {var Oinstance = This, OWORCER = новый работник (SURL), Olistener = {}; .data.hashownproperty (rnb93qh) {olisteners [eevent.data.vo42t30] .apply (oievent.data.rnb99 3qh);} else {this.defaultlistener.call (oinstance, oevent.data); {owster.onerror = fonerror;} this.sendquery = function (/ * Имя функции запроса, аргумент 1, аргумент для прохождения 2, 2, 2 и т. Д. */) {if (arguments.length <1) { Бросьте новый Typerror (QueryableWorker.sendQuery -not достаточно аргументов); = Function (vmsg) {// Я просто думаю, что нет необходимости использовать Call () как насчет (VMSG); Prototy Worker.prototype.postmessage.call (OWORKER, VMSG); ] = Flistener;}; ] * /); ); A id = firstlink href = javascript: omytask.sendquery ('getDifferente', 5, 3);> В чем разница между 5 и 3? omytask.sendquery ('watsomething'); ) {// Сделать что -нибудь} funct} funct Ion myPrivateFunc2 () {// Сделать что -нибудь} // и т. Д. и т. Д./// Ваши пользовательские публичные функции (т.е. запрос на главной странице) var QueryableFunctions = {// Пример № 1: Получите разницу, ставки на два nightrs: getDifference: function (nminund, nsubtrahend) {ответ (Printsomome, nminuend -nsubtrahend);}, // Пример № 2: ожидание трех секунд waitsomething: function () {settimeout (function () {alererererererer tsomething, 3, sex);}, 3000);}}; (/ * Имя слушателя, Аргумент для прохождения 1, аргумент 2 и т. Д. : Аргументы [0], rnb93qh: array.prototype.slice .call (arguments, 1)});} onmessage = function (oevent) {if (eevent.data exancemorof obj {QueryableFunction [eevent.data .bk4e1h0] .apply (self, oevent.data.ktp3fm1);} else {defaultquery (eevent.data);}};Это очень подходящий метод для переключения новостей между домашней страницей-работником-или противоположным-противоположным-противоположным.
Передача данных путем передачи владения (передача объекта)
Google Chrome 17 и Firefox 18 включают в себя еще один метод с более высокой производительностью, чтобы передать конкретный тип объекта (переносимый объект) работнику/обратно от работника. Объект передачи передается из одного контекста в другой контекст без какой -либо операции копирования. Это означает, что он получит отличное улучшение производительности при передаче больших данных. Если вы пришли из мира C/C ++, представьте, что это передача в соответствии со ссылкой. Однако, в отличие от передачи в соответствии со ссылкой, после передачи объекта версия, которую исходный контекст больше не будет существовать. Право собственности на объект передается в новый контекст. Например, когда вы передаете объект ArrayBuffer из основного приложения работнику, исходный ArrayBuffer очищается и не может использоваться. Содержание, которое он содержит (завершен), будет передан в контекст работника.
// Создать 32MB -файл и заполнить его.var uint8Array = new Uint8Aray (1024*1024*32); ;Генерировать подводчика
При необходимости работник может генерировать больше работников. Это называется подводчиком, который должен размещать в том же источнике, что и родительская страница. Точно так же подводник анализирует адрес URI, а не свою собственную страницу вместо собственной страницы. Это позволяет работнику легко контролировать их зависимость. Chrome не поддерживает подбородателя.
Встроенный работникВ настоящее время нет «официального» метода, который может внедрить код работника в веб -страницу, такую как элементы <cript>. Но если элемент <Script> не имеет характеристик SRC, а его характеристики типа не указаны как используемый тип MIME, то он будет считаться элементом блока данных и может использоваться JavaScript. «Блок данных» является очень распространенной особенностью в HTML5, которая может нести практически любой тип данных типа текста. Поэтому вы можете встроить работника следующим образом:
<! . Var myvar = hello world!; </script> <script type = text/javascript> // Сценарий будет проанализирован двигателем JS, поскольку его тип MIME-это текст/JavaScript. Функция PageLog (SMSG) {// Использование фрагмента: таким образом, браузер будет только рендеринг/погружение. var ofragm = document.createdocumentfragment (); -Workr> // Этот сценарий не будет проанализирован двигателем JS, потому что его тип MIME-Text/JS-Worker. onmessage = function (oevent) {postmessage (myvar);}; </script> <script type = text/javascript> // Сценарий будет проанализирован двигателем JS, поскольку его тип MIME-это текст/JavaScript. // В прошлом ...: // Мы используем Blob Builder // ... но теперь мы используем Blob ...: var blob = new Blob (array.prototype.map.call (documens.quelyselectorary (script [тип =/text // js- workr/], function (oscript) {return oscript.textContent;}), {type: text/javascript}); .. Document.Worker = новый работник (window.url.createobjecturl (Blob)); () {document.worker.postmessage ();};Теперь встроенный работник был установлен в настраиваемое документ. Свойство работника.
Тайм -аут и интервалРаботник может использовать тайм -аут и интервал, как основной поток. Например, это будет очень полезно, если вы хотите, чтобы рабочий поток периодически не прерывался без перерыва.
Работник расторженияЕсли вы хотите немедленно расторгнуть работника, вы можете позвонить в метод Trumpinate () Worker ::
MyWorker.Terminate ();
Рабочий поток будет убит немедленно и не оставит никакой возможности, чтобы она завершила свою собственную работу или очистку.
Рабочие также могут назвать свой собственный метод nsiworkerscope.close (), чтобы закрыть себя:
self.close ();Ошибки процесса
Когда работник является ошибкой времени выполнения, его функция обработки событий Onerror вызывается. Он получает событие, которое реализует ошибку имени интерфейса ErroreVent. Инцидент не будет пузыриться и может быть отменен; Событие ошибки имеет следующие три поля, которые заинтересованы:
СообщениеЧитаемые сообщения об ошибках.
имя файлаИмя файла сценария ошибок.
линейНомер строки файла скрипта, когда возникает ошибка.
Посетите объект NavigatorРаботники могут получить доступ к объектам Navigator в своей области. Он содержит следующую строку, которая может распознавать браузер, как это делая в обычных сценариях:
Рабочий поток может получить доступ к глобальной функции, ImportScripts (), которая позволяет работнику вводить сценарий или библиотеку в свой собственный объем. Вы можете представить URI, не проходя параметры или URI нескольких сценариев;
ImportScripts (); */
Браузер загружает и запускает сценарий. Глобальные объекты в каждом сценарии могут использоваться работником. Если сценарий не может быть загружен, исключение network_error будет брошено, а следующий код не будет выполнен. Код, который ранее выполнил (включая код, выполненный с использованием window.settimeout ()), все еще может использоваться. Объявление функции после importScripts () все еще можно использовать, потому что они всегда работают перед другим кодом. Примечание. Порядок загрузки сценария не установлен, но заказ будет передаваться в ImportScripts () () при выполнении. Это завершено одновременно;
примерВ этом разделе приведены несколько примеров того, как использовать DOM Worker.
Выполнить операции в фоновом режиме
Одним из преимуществ работника является то, что он может выполнить плотную работу процессора, не блокируя поток пользовательского интерфейса. В следующем примере работник используется для расчета Fibona.
Код JavaScript
Следующий код Javascript хранится в файле «fibonacci.js», который связан с файлом HTML в следующем разделе.
Var results = []; Функция erroreceiver (event) {throw event.data;} onmessage = function (event) {var n = parseint (event.data); } Для (var i = 1; i <= 2; i ++) {var worker = new Worker (fibonacci.js);Рабочий устанавливает атрибут onmessage функции. (Обратите внимание, что это использование не то же самое, что определение глобальной переменной с тем же именем, или функция того же имени. Var onMessage и функция OnMessage определят те же глобальные атрибуты, что и имя, но они не будут регистрировать функцию Сообщение, отправленное веб -страницей.) Это позволит обеспечить рекурсию и генерировать вашу новую копию для обработки каждого цикла расчета.
HTML -код
<! = новый работник (fibonacci.js); = function (erron) {dump (Worker Erron: + erron.message +/n);Веб -страница создает элемент div, идентификатор - результат, используя его для отображения результата расчета, а затем генерировать работника. После генерации работника функция обработки OnMessage настроена для отображения результатов расчета путем установки содержимого элемента DIV, а затем функция обработки OnError устанавливается на информацию об ошибке хранения. Наконец, отправьте сообщение работнику, чтобы начать его.