18

我有几个关于网络工作者的问题

  • 工人是否有权访问存储?例如 indexedDB/webSQL 和启动 worker 的文件的本地存储?

  • 如何在工作人员中包含文件?我有一个functions.js有很多与快速应用程序相关的功能,将文件的内容复制粘贴到工作人员中只是让两个不同的地方更新我的功能真的没有意义。

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

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

这是一个 chrome 应用程序,所以我可以访问最新的 Chrome API,我不需要关心向后兼容性。

4

2 回答 2

9

网络工作者没有任何形式的 DOM 访问 - 期间。所有 DOM 操作都必须从主 JS 线程完成。Web Worker 只能通过消息传递与主线程通信。

这个以前的SO问题告诉您,网络工作者无法访问本地存储,这很容易通过 Google 搜索找到。

同一个线程有一个网络工作者可以访问的列表。

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

在我看来,这听起来像是您需要对网络工作者可以做什么和不能做什么做一些基础研究(因为在网络上有一个关于它的 TON 写的),然后回来提出更多更具体的问题,其中包含知识。

对于网络工作者来说,没有任何技巧可以让你做的比你应该做的更多。

你可以在主 JS 线程中工作,如果你有很多工作要做并且希望主 UI 尽可能地响应,你可以使用 setTimeout 分小块完成工作。这是一种非常古老的设计模式,可以追溯到线程可用或易于使用之前的日子。它涉及设计您的工作,以便可以将其状态存储在某个持久对象中的小块完成,然后您可以重复做少量工作然后返回,只在下一个计时器滴答时拾取下一个工作.

于 2011-09-21T06:17:22.330 回答
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>

使用包含 hello 函数的库 worker_lib2.js。

function hello(msg) {
    return 'Hello... ' + msg;
}
于 2013-08-28T14:09:13.260 回答