Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用blob创建SharedWorker?_Javascript_Web Worker - Fatal编程技术网

Javascript 如何使用blob创建SharedWorker?

Javascript 如何使用blob创建SharedWorker?,javascript,web-worker,Javascript,Web Worker,我想创建一个SharedWorker,如一本优秀书籍中的一章所述: 我为普通的网络工作者创造了一个很好的例子: function createAsker(limit) { var blob = new Blob(["onmessage = function(e) { " + "if (self.higher === undefined) self.higher = " + limit + "; " +

我想创建一个SharedWorker,如一本优秀书籍中的一章所述:

我为普通的网络工作者创造了一个很好的例子:

function createAsker(limit) {
    var blob = new Blob(["onmessage = function(e) { " +
                           "if (self.higher === undefined) self.higher = " + limit + "; " +
                           "if (self.lower === undefined) self.lower = 1;" +
                           "if (e.data === 'correct') { " +
                             "postMessage('Party time'); " +
                           "} else {" +
                             "if (e.data === 'greater') self.lower = parseInt((self.lower + self.higher) / 2);" +
                             "if (e.data === 'lower') self.higher = parseInt((self.lower + self.higher) / 2);" +
                             "postMessage(parseInt((self.lower + self.higher) / 2));" +
                           "}" +
                         "}"]);
    var blobURL = window.URL.createObjectURL(blob);
    var worker = new Worker(blobURL);
    return worker;
}

var asker = createAsker(1000);

function createAnswerer(limit) {
    var blob = new Blob(["onmessage = function(e) { " +
                            "postMessage((e.data == " + limit + ") ? 'correct' : ((e.data < " + limit + ") ? 'greater' : 'lower'));" +
                         "}"]);
    var blobURL = window.URL.createObjectURL(blob);
    var worker = new Worker(blobURL);
    return worker;
}

var answerer = createAnswerer(42);

asker.onmessage = function(e) {
  console.log('Asker says: ' + e.data);
  if (e.data !== "Party time") {
    setTimeout(function() {answerer.postMessage(e.data)}, 1000);
  }
};

answerer.onmessage = function(e) {
  console.log('Answerer says: ' + e.data);
  setTimeout(function() {asker.postMessage(e.data)}, 1000);
};

asker.postMessage('start');

在发送foobar消息后,我希望我的共享工作人员发布消息,或者至少我希望调试器引导我进入代码,但是,当我运行此代码时,控制台会给出两个未定义的响应。

Base64编码提供一个永久URL,直到源代码更改

const source='importScript('https://anotherhost/worker.js")';
consturl='data:application/javascript;base64,“+btoa(来源);
const worker=新的共享工作人员(url);
它至少可以在Chrome73和Firefox66中使用


有一个大约65千字节的编码URL。

我认为你不能从
Blob
创建一个
SharedWorker
,因为每个
Blob
都有一个不同的对象URL,很难被共享。@Bergi有趣的一点。然而,共享工作线程是在Chrome中创建的。我不是说一切都是正确的,如果一切都按预期进行,我不会有任何疑问。但是,如果我们抛开创建sharedworker的方式不谈,那么在传递给Blob构造函数的脚本中,或者在函数之后的用法中,您是否看到该代码中存在任何其他问题?
w.port.onmessage('foobar')看起来肯定是错的。您不希望直接调用事件处理程序。(如果您使用了
w.port.addEventListener(“message”,函数(e){console.log(e.data);});
,就会产生一条明显的错误消息)。您可能想改用
postMessage
。您可以先创建一个较小或最小的
SharedWorker
,然后让它通过
postMessage()
从连接到的第一个窗口请求所需的其余代码,从而绕过该长度限制。一旦收到,它就必须
eval()
将其放入自己的全局范围。()对公认答案的小小修正。它应该是
importScripts
而不是
importScripts
<代码>常量源='importScripts('https://anotherhost/worker.js")';
function createWorker() {
    var blob = new Blob(['addEventListener( "connect", function(evt){ ' +
                            'var port = evt.ports[0]; ' +
                            'port.addEventListener( "message", function(evt){' +
                              'port.postMessage( .. );debugger;' +
                            '} );' +
                            'port.start();' +
                          '} );']);
    var blobURL = window.URL.createObjectURL(blob);
    var w = new SharedWorker(blobURL);
    return w;
}

var w = createWorker();

w.port.start();

w.port.onmessage = function(e) {
  console.log(e.data);
};

w.port.onmessage('foobar');