相关疑难解决方法(0)

JavaScript和线程

有没有办法在JavaScript中进行多线程?

javascript multithreading

128
推荐指数
7
解决办法
12万
查看次数

如何从字符串创建Web Worker

如何使用从字符串创建Web worker(通过POST请求提供)?

我能想到的一种方法,但我不确定如何实现它,是通过从服务器响应创建数据URI,并将其传递给Worker构造函数,但我听说有些浏览器不允许这,因为相同的原产地政策.

MDN陈述围绕数据URI的原始政策的不确定性:

注意:作为Worker构造函数的参数传递的URI必须遵循同源策略.目前,浏览器供应商对数据URI是否来源不一致存在分歧; Gecko 10.0(Firefox 10.0/Thunderbird 10.0)及更高版本确实允许数据URI作为工作人员的有效脚本.其他浏览器可能不同意.

这里还有一篇关于whatwg讨论它的帖子.

javascript web-worker data-uri

76
推荐指数
3
解决办法
3万
查看次数

如何使用用户脚本加载共享Web worker?

我想用一个用户脚本加载一个共享工作者.问题是用户脚本是免费的,并且没有托管文件的商业模式 - 我也不想使用服务器,甚至是免费服务器来托管一个小文件.无论如何,我尝试了它,我(当然)得到了相同的原始政策错误:

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'.
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以通过将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).

话虽如此,如果我的问题可以某种方式得到改善或澄清,请发表评论.

javascript greasemonkey userscripts

32
推荐指数
2
解决办法
2026
查看次数

为什么Web Worker不能直接调用函数?

我们可以像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)

html5 web-worker

28
推荐指数
2
解决办法
1万
查看次数

是否可以限制javascript函数的范围?

假设我在全局范围内有变量.

假设我希望定义一个我可以保证不能访问这个变量的函数,有没有办法包装函数,或调用函数,这将确保这个?

实际上,我需要任何规定的函数来对变量进行良好定义的访问,并且该访问要在该函数定义之前定义,并与该函数定义分开.

动机:我正在考虑用户提交功能的可能性.我应该能够相信这个功能是各种各样的"安全",因此很乐意在我自己的网站上发布它们.

javascript security

24
推荐指数
3
解决办法
5615
查看次数

如何安全地在浏览器中运行用户提供的Javascript代码?

想象一下我想要不断调用用户提供的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 security xss virtual-machine

12
推荐指数
2
解决办法
3671
查看次数

如何使用(function(global){...})(this);

这个帖子中,我找到了一个我想要使用的JavaScript代码片段.

代码如下:

(function(global) {
  // the function code comes here
})(this);
Run Code Online (Sandbox Code Playgroud)

如何调用此函数来执行代码?我需要为此global变量传递什么?

javascript function

10
推荐指数
2
解决办法
1万
查看次数

如何同步访问 Promise 的结果?

让我从我喜欢异步代码的事实开始。我永远不会在生产中将异步代码包装在同步包装器中,但这仍然是我想学习如何做的事情。我指的是 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 event-loop synchronous node.js promise

6
推荐指数
1
解决办法
5385
查看次数

在 JavaScript 闭包中使用 Promise 与 Web Worker 一起工作

我正在 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 image-processing web-worker es6-promise

2
推荐指数
1
解决办法
6862
查看次数