Что я могу использовать с веб-работниками? - PullRequest
18 голосов
/ 21 сентября 2011

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

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 21 сентября 2011

Нет доступа DOM любого вида от веб-работника - точка. Все манипуляции с DOM должны выполняться из основного потока JS. Веб-работники могут общаться с основным потоком только через обмен сообщениями.

Этот предыдущий вопрос SO говорит о том, что веб-работники не могут получить доступ к локальному хранилищу, что было легко найти с помощью поиска Google.

В той же ветке есть список того, что могут получить веб-работники.

Непонятно, что вы подразумеваете под "включить файл в работника". Вы можете импортировать скрипты. Я не знаю о чем ты еще спрашиваешь. Вы можете использовать вызов ajax для извлечения данных, если это поможет вам с вашим аудиофайлом.

Для меня это звучит так, будто вам нужно провести какое-то базовое исследование о том, что вы можете и не можете делать с веб-работниками (так как об этом написано TON в Интернете), а затем возвращаетесь с гораздо более конкретными вопросами. которые включают это знание.

Для веб-работников не существует хаков, которые позволили бы вам делать больше, чем вы предполагаете.

Вы можете выполнять работу в главном потоке JS и выполнять ее небольшими порциями с помощью setTimeout, если у вас много работы и вы хотите, чтобы основной пользовательский интерфейс был максимально отзывчивым. Это очень старый шаблон проектирования, который восходит к тем дням, когда многопоточность была доступна или проста в использовании. Он включает в себя проектирование вашей работы таким образом, чтобы ее можно было выполнять небольшими частями с состоянием, сохраненным в каком-либо постоянном объекте, а затем вы можете многократно выполнять небольшие объемы работы и затем возвращаться обратно, только чтобы подобрать следующий фрагмент работы на следующем такте таймера. .

3 голосов
/ 28 августа 2013

Вы можете загрузить библиотеку 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;
}
...