我可以与Web Workers一起使用什么?

时间:2011-09-21 06:01:41

标签: javascript html5 google-chrome google-chrome-extension web-worker

我有一些关于网络工作者的问题

  • 工作人员是否可以访问存储空间?例如indexedDB / webSQL和工作者从哪个文件开始本地存储?

  • 如何在工作程序中包含文件?我有一个functions.js,它有很多与应用程序相关的快速功能,复制粘贴文件的确很合理工人的内容只有两个不同的地方才能更新我的职能。

  • 我可以在工作人员中使用DOM吗?喜欢在临时音频标签中加载音频文件以读取其持续时间以及是否可播放。不访问父页面的dom,但在worker本身中有一个DOM。

  • 如果任何问题的答案都是否定的,那么如何/应该手动完成?

这适用于Chrome应用,因此我可以访问最新的Chrome API,而且我不需要关心向后兼容性。

2 个答案:

答案 0 :(得分:9)

Web工作者没有任何DOM访问权限 - 期间。所有DOM操作必须从主JS线程完成。 Web Workers只能通过消息传递与主线程进行通信。

previous SO question告诉您网络工作人员无法访问本地存储,这是Google搜索中很容易找到的。

同一个帖子有一个Web工作者可以访问的列表。

目前还不清楚“在工人中包含文件”是什么意思。您可以导入脚本。我不知道你还在问什么。您可以使用ajax调用来获取数据,如果这样可以帮助您处理音频文件。

这对我来说听起来像是你需要做一些关于你能做什么和不能做什么的基础研究(因为在网上有关于它的TON),然后回过头来讨论更具体的问题纳入这些知识。

网络工作者没有任何黑客可以让你做的比你应该做的更多。

如果你有很多工作要做,并希望尽可能保持主UI的响应能力,你可以在主JS线程中工作并使用setTimeout以小块的方式完成。这是一个非常古老的设计模式,可以追溯到线程可用或易于使用之前的日子。它涉及设计你的工作,使得它可以在一些持久对象中存储状态的小块中完成,然后你可以反复做少量的工作然后返回,只是为了在下一个计时器滴答器上接下一段工作

答案 1 :(得分:3)

您可以加载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;
}