Что я могу использовать с веб-рабочими?
У меня есть несколько вопросов о веб-работниках
-
Имеет ли рабочий доступ к хранилищу?. indexedDB/webSQL и локальное хранилище файла, с которого был начат рабочий?
-
Как я могу добавить файл в рабочий? У меня есть functions.js
, у которого есть много быстрых функций, связанных с приложением, и действительно не имеет смысла копировать вставку содержимого файла в работник должен иметь только два разных места, чтобы обновить мои функции.
-
Могу ли я иметь DOM внутри рабочего?, например, загружать аудиофайл в звуковой тег temp, чтобы читать его продолжительность и если он воспроизводится или нет. Не получить доступ к родительской странице, но иметь DOM в самом рабочем.
-
Если ответы на какой-либо вопрос отрицательны, то как это сделать/должно быть сделано вручную?
Это для хром-приложения, поэтому у меня есть доступ к новейшим API-интерфейсам Chrome, и мне не нужно заботиться о обратной совместимости.
Ответы
Ответ 1
Нет доступа DOM любого вида от веб-рабочего периода. ALL DOM-манипуляция должна выполняться из основного потока JS. Веб-работники могут общаться только с основным потоком посредством обмена сообщениями.
Этот предыдущий вопрос SO сообщает вам, что веб-работники не могут получить доступ к локальному хранилищу, что было легко найдено при поиске Google.
В том же потоке есть список того, что веб-работники могут получить.
Неясно, что вы подразумеваете под "включать файл в работника". Вы можете импортировать скрипты. Я не знаю, о чем ты спрашиваешь. Вы можете использовать вызов ajax для извлечения данных, если это поможет вам в вашем звуковом файле.
Это звучит для меня так же, как вам нужно сделать некоторые фундаментальные исследования о том, что вы можете и чего не можете сделать с веб-работниками (так как TON написано об этом в Интернете), а затем вернуться с гораздо более конкретными вопросами которые включают это знание.
Нет никаких хаков для веб-работников, которые позволят вам делать больше, чем вы должны делать.
Вы можете работать в основном потоке JS и делать это небольшими фрагментами с помощью setTimeout, если у вас есть много работы и вы хотите, чтобы основной пользовательский интерфейс был максимально реагирующим. Это очень старый шаблон дизайна, который восходит к тем дням, когда потоки были доступны или просты в использовании. Это включает в себя проектирование вашей работы таким образом, чтобы ее можно было делать небольшими частями с сохранением состояния в каком-то постоянном объекте, а затем вы можете многократно выполнять небольшую работу и затем возвращаться назад, только чтобы подобрать следующую часть работы на следующем тике.
Ответ 2
Вы можете загрузить библиотеку javascript. См. Этот пример:
<body>
<button>Start</button>
<div id="output"></div>
<script id="worker_1" type="text/js-worker">
importScripts(base_url + '/worker_lib2.js');
function run(event) {
var msg = event.data;
this.postMessage({ answer: hello(event.data.name)});
}
this.addEventListener('message', run, false);
</script>
<script>
var base_url = window.location.href.replace(/\\/g,'/').replace(/\/[^\/]*$/, '');
var array = ['var base_url = "' + base_url + '";' + $('#worker_1').html()];
var blob = new Blob(array, {type: "text/javascript"});
$('button').click(function() {
var url = window.URL.createObjectURL(blob);
console.log(url);
var worker = new Worker(url);
worker.addEventListener('message', function(event) {
$('#output').html(event.data.answer);
}, false);
worker.postMessage({
name: 'Steve'
});
});
</script>
</body>
С библиотекой worker_lib2.js, содержащей функцию hello.
function hello(msg) {
return 'Hello... ' + msg;
}