如何使用从字符串创建Web worker(通过POST请求提供)?
我能想到的一种方法,但我不确定如何实现它,是通过从服务器响应创建数据URI,并将其传递给Worker构造函数,但我听说有些浏览器不允许这,因为相同的原产地政策.
注意:作为Worker构造函数的参数传递的URI必须遵循同源策略.目前,浏览器供应商对数据URI是否来源不一致存在分歧; Gecko 10.0(Firefox 10.0/Thunderbird 10.0)及更高版本确实允许数据URI作为工作人员的有效脚本.其他浏览器可能不同意.
这里还有一篇关于whatwg讨论它的帖子.
我想用一个用户脚本加载一个共享工作者.问题是用户脚本是免费的,并且没有托管文件的商业模式 - 我也不想使用服务器,甚至是免费服务器来托管一个小文件.无论如何,我尝试了它,我(当然)得到了相同的原始政策错误:
Run Code Online (Sandbox Code Playgroud)Uncaught SecurityError: Failed to construct 'SharedWorker': Script at 'https://cdn.rawgit.com/viziionary/Nacho-Bot/master/webworker.js' cannot be accessed from origin 'http://stackoverflow.com'.
还有另一种方法可以通过将worker函数转换为字符串然后转换为Blob并将其作为worker加载来加载Web worker,但我也尝试过:
var sharedWorkers = {};
var startSharedWorker = function(workerFunc){
var funcString = workerFunc.toString();
var index = funcString.indexOf('{');
var funcStringClean = funcString.substring(index + 1, funcString.length - 1);
var blob = new Blob([funcStringClean], { type: "text/javascript" });
sharedWorkers.google = new SharedWorker(window.URL.createObjectURL(blob));
sharedWorkers.google.port.start();
};
Run Code Online (Sandbox Code Playgroud)
这也不起作用.为什么?因为共享工作程序是根据其工作文件的加载位置共享的.由于createObjectURL为每次使用生成唯一的文件名,因此工作人员将永远不会拥有相同的URL,因此永远不会共享.
我怎么解决这个问题?
注:我想询问具体的解决方案,但在这一点上,我想我能做的最好是问一个更宽泛的方式的任何 解决问题的办法,因为我所有的尝试的解决方案似乎根本不可能的,因为相同的起源政策或方式
URL.createObjectURL工作(从规范,似乎不可能改变生成的文件URL).话虽如此,如果我的问题可以某种方式得到改善或澄清,请发表评论.
我们可以像HTML5一样使用HTML5中的web worker:
var worker = new Worker('worker.js');
Run Code Online (Sandbox Code Playgroud)
但为什么我们不能称这样的函数?
var worker = new Worker(function(){
//do something
});
Run Code Online (Sandbox Code Playgroud) 假设我在全局范围内有变量.
假设我希望定义一个我可以保证不能访问这个变量的函数,有没有办法包装函数,或调用函数,这将确保这个?
实际上,我需要任何规定的函数来对变量进行良好定义的访问,并且该访问要在该函数定义之前定义,并与该函数定义分开.
动机:我正在考虑用户提交功能的可能性.我应该能够相信这个功能是各种各样的"安全",因此很乐意在我自己的网站上发布它们.
想象一下我想要不断调用用户提供的Javascript代码的场景,如下例所示,其中getUserResult是某个用户(非我自己)编写的函数:
for (var i = 0; i < N; ++i) {
var x = getUserResult(currentState);
updateState(currentState, x);
}
Run Code Online (Sandbox Code Playgroud)
如何在浏览器和/或Node.js中执行这种代码,没有任何安全风险?
更一般地说,如何执行不允许修改甚至读取当前网页或任何其他全局状态的Javascript函数?是否有类似浏览器内的"JS虚拟机"?
JSFiddle如何确保您不能运行任何恶意代码(至少它可能会破坏您的登录名,在页面生命周期内运行机器人,如果不做更糟糕的事情)?或者它根本不确定?
在这个帖子中,我找到了一个我想要使用的JavaScript代码片段.
代码如下:
(function(global) {
// the function code comes here
})(this);
Run Code Online (Sandbox Code Playgroud)
如何调用此函数来执行代码?我需要为此global变量传递什么?
让我从我喜欢异步代码的事实开始。我永远不会在生产中将异步代码包装在同步包装器中,但这仍然是我想学习如何做的事情。我指的是 Node.JS,而不是浏览器。有很多方法可以同步访问异步函数的结果,例如使用child_process.spawnSync或工作器和Atomics。这些方法的问题是:
let prom = Promise.resolve(4);
// It is now impossible (as far as I know) to access the result of prom synchronously
Run Code Online (Sandbox Code Playgroud)
Promise 无法在调用中发送postMessage,因此工作人员无法访问它们并等待它们同步完成或根本无法完成。有人可能会想,为什么不这样做:
let prom = Promise.resolve(4);
prom.then(res => global.result = res);
while (!global.result) {}; // Do nothing
// Once the loop finishes, the result *would* be available
console.log(global.result); // => 4
Run Code Online (Sandbox Code Playgroud)
当然,这是行不通的。事件循环在开始处理 的回调函数之前等待完全执行 while 循环prom.then。这会导致无限循环。所以这让我问,“是否有一个同步任务必须非正常执行才能等待承诺?”
编辑
顺便说一句,我完全理解async/await。如果我使用 Node.JS 模块,那么我可以这样做:
let resolved = await prom;
Run Code Online (Sandbox Code Playgroud)
或者,如果我不是,我可以将整个脚本包装在一个 …
我正在 JavaScript 中执行图像处理操作,该操作按预期工作,但有时它会冻结 UI,这使得我使用 Web Worker 来执行图像处理功能。我有一个场景,我需要处理多个。以下是我用来实现上述壮举的工作流程的摘要。
//closure
var filter = (function(){
function process(args){
var promise = new Promise(function (resolve, reject) {
if (typeof (Worker) !== "undefined") {
if (typeof (imgWorker) == "undefined") {
imgWorker = new Worker("/processWorker.js");
}
imgWorker.postMessage(args);
imgWorker.onmessage = function (event) {
resolve(event.data);
};
} else {
reject("Sorry, your browser does not support Web Workers...");
}
});
return promise;
}
return {
process: function(args){
return process(args);
}
}
})();
function manipulate(args, callback){
filter.process(args).then(function(res){
callback(res);
});
}
Run Code Online (Sandbox Code Playgroud)
在这里,我正在加载多个图像并将它们传递到 …
javascript ×8
web-worker ×3
security ×2
data-uri ×1
es6-promise ×1
event-loop ×1
function ×1
greasemonkey ×1
html5 ×1
node.js ×1
promise ×1
synchronous ×1
userscripts ×1
xss ×1