我有一个资源消耗 DOM(浏览器)相关的 JavaScript 进程。启动时它会阻塞页面(其他与 DOM 相关的处理)。是否可以异步并行运行此过程,并在完成后将结果传递到主页?Web 工作者并非如此,因为进程与 DOM 一起工作。
这可以用 iframe 实现吗?JS 是否也在 iframe 阻止托管页面 DOM 中启动?
我有一个资源消耗 DOM(浏览器)相关的 JavaScript 进程。启动时它会阻塞页面(其他与 DOM 相关的处理)。是否可以异步并行运行此过程,并在完成后将结果传递到主页?Web 工作者并非如此,因为进程与 DOM 一起工作。
这可以用 iframe 实现吗?JS 是否也在 iframe 阻止托管页面 DOM 中启动?
实际上,这将是使用WebWorkers的主要示例,但正如您正确提到的那样,您不会在那里引用 DOM。您唯一的选择是将这个过程分离成更小的任务。如果你能做到这一点,你需要问自己两个问题
如果您可以用No回答这两个问题,则可以设置一个失控脚本计时器并异步执行这些任务。例子:
var taskList = [
function() {},
function() {},
function() {},
function() {}
// a whole lot more entrys
]; // in a real-world scenario you would `.push()` values or functions
(function _loop() {
setTimeout(function() {
var start = Date.now();
do {
taskList.shift()();
} while( taskList.length && Date.now() - start < 100)
if( taskList.length ) setTimeout( _loop, 100 );
},100);
}());
上述算法将taskList
尽可能快地执行包含的函数,但在最大 100 毫秒的时间范围内。这将确保浏览器和UI 线程在处理过程中不会被阻塞超过100 毫秒。因此浏览器将保持响应。