Подтвердить что ты не робот

Что я могу использовать с веб-рабочими?

У меня есть несколько вопросов о веб-работниках

  • Имеет ли рабочий доступ к хранилищу?. indexedDB/webSQL и локальное хранилище файла, с которого был начат рабочий?

  • Как я могу добавить файл в рабочий? У меня есть functions.js, у которого есть много быстрых функций, связанных с приложением, и действительно не имеет смысла копировать вставку содержимого файла в работник должен иметь только два разных места, чтобы обновить мои функции.

  • Могу ли я иметь DOM внутри рабочего?, например, загружать аудиофайл в звуковой тег temp, чтобы читать его продолжительность и если он воспроизводится или нет. Не получить доступ к родительской странице, но иметь DOM в самом рабочем.

  • Если ответы на какой-либо вопрос отрицательны, то как это сделать/должно быть сделано вручную?

Это для хром-приложения, поэтому у меня есть доступ к новейшим API-интерфейсам Chrome, и мне не нужно заботиться о обратной совместимости.

4b9b3361

Ответ 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;
}