我目前有这个代码来创建一个Web Worker:
w = new Worker("webwork.js");
w.onmessage = function(event) { alert(event.data); }
Run Code Online (Sandbox Code Playgroud)
然后是webwork.jsWeb Worker 的代码:
self.onmessage = function(event) {
//var ss=r; //Causes error because of undefined
var ss="";
for(var currProp in event) {
ss+=("event."+currProp+"="+event[currProp]+"\n");
}
postMessage(ss);
}
Run Code Online (Sandbox Code Playgroud)
现在我想ArrayBuffer用这段代码传输128兆字节:
var r = new ArrayBuffer(1048576*128);
w.postMessage(0, [r]);
Run Code Online (Sandbox Code Playgroud)
既然我已经转移了变量r,我该如何从Web Worker本身访问它.我已经试过event.r,只是r,self.r和喜欢尝试添加第二个函数参数为数组其他东西ArrayBuffers,但没有任何工程.
如何从Web Worker访问传输的变量?
我正在学习可转移对象:http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast
它们看起来非常棒,我想在我的扩展中使用它们来加速将数据从iframe内部传递到iframe之外.
我有这个示例代码工作,但它使用Web Worker:
var s = document.createElement("script");
s.type = "text/js-worker";
s.innerHTML = 'console.log("i ran!");';
document.body.appendChild(s);
var blob = new Blob(Array.prototype.map.call(document.querySelectorAll("script[type=\"text\/js-worker\"]"), function (oScript) {
return oScript.textContent;
}), { type: "text/javascript" });
var worker = new Worker(window.URL.createObjectURL(blob));
var arrayBuffer = new ArrayBuffer(1);
worker.onmessage = function (oEvent) {
console.log("Called back by the worker!\n");
};
console.log("worker:", worker);
worker.postMessage(arrayBuffer, [arrayBuffer]);
if (arrayBuffer.byteLength) {
console.error("nope");
} else {
console.log("it worked");
}
Run Code Online (Sandbox Code Playgroud)
有没有人有任何关于支持的信息,或支持使用端口的crbug的时间表,如:
var port = chrome.runtime.connect({
name: 'youTubeIFrameConnectRequest'
});
//port.postMessage -- transferrable …Run Code Online (Sandbox Code Playgroud) 在Javascript ES6中,在浏览器中,我想使用"Transferable"界面将自定义类对象传输给Web worker.这可能吗?我可以找到有关ArrayBuffer对象的文档,但不能找到自定义类对象的文档.
这与如何通过Web-Workers传递自定义类实例不重复?因为我的问题是关于Transferable接口的.我想将自定义类实例传递给worker而不复制它.
我正在学习MessageChannel和可转移的对象.
我的页面中有一个跨域的iframe.MessageChannel周围的文档表明它完全支持跨域通信.
我在iframe中的跨域页面中有这个代码:
var messageChannel = new MessageChannel();
// Transfer port2 to the background page to establish communications.
window.parent.postMessage('connect', 'chrome-extension://jbnkffmindojffecdhbbmekbmkkfpmjd', [messageChannel.port2]);
messageChannel.port1.start();
// Give time for background to setup its port. Not great practice, but OK for example.
setTimeout(function(){
// Create a 32MB "file" and fill it.
var uInt8Array = new Uint8Array(1024*1024*32); // 32MB
for (var i = 0; i < uInt8Array.length; ++i) {
uInt8Array[i] = i;
}
messageChannel.port1.onmessage = function(message){
console.log('iframe message:', message);
};
messageChannel.port1.postMessage(uInt8Array.buffer, …Run Code Online (Sandbox Code Playgroud) 这是我的工人的代码:
onmessage = function (event) {
postMessage({'data': event.data}, ['http://localhost:9000']);
};
Run Code Online (Sandbox Code Playgroud)
这是我使用工人的代码:
var worker = new Worker("/path/to/my/worker.js");
worker.onmessage = function (event) {
console.log("RECEIVED: ", event.data);
};
worker.onerror = function (err) {
console.log('ERROR: ', err)
};
worker.postMessage({'data': 'blabla', 'msg': 'Hi'});
Run Code Online (Sandbox Code Playgroud)
但是当调用工作代码中的 postMessage 时,它给了我这个错误:“无法在 'DedicatedWorkerGlobalScope' 上执行 'postMessage':索引 0 处的值没有可转移类型。”
我还尝试使用以下代码序列化对象:
onmessage = function (event) {
postMessage(JSON.stringify({'data': event.data}), ['http://localhost:9000']);
};
Run Code Online (Sandbox Code Playgroud)
但一切都没有改变。
- - - 编辑 - - - - - - - - - - - - - - - - - - - …
我将有一个网络工作者来解析巨大的文本文件(200000行,尽管语法简单)。我希望用户通过拖放即可提交该文件,否则将获得一个File对象:
var work = new Worker("parser.js")
document.addEventListener("drop", function(e) {
e.preventDefault();
var dt = e.dataTransfer;
var files = dt.files;
if(files.length>0) {
var firstFile = files[0]
var reader = new FileReader();
//SEND FILE TO WORKER?
}
});
Run Code Online (Sandbox Code Playgroud)
我听说了可转让的对象。有没有办法将文件传输到Worker?以某种方式,GUI线程不会因读取文件而变慢?
transferable ×6
javascript ×5
web-worker ×4
ecmascript-6 ×1
fileapi ×1
iframe ×1
postmessage ×1
worker ×1