我有一个消耗资源的 DOM(浏览器)相关的 JavaScript 进程。启动时它会阻塞页面(其他 DOM 相关的处理)。是否可以异步并行运行此过程,并在完成后将结果传递到主页? Web Workers 则不然,因为流程使用 DOM。
这可以用 iframe 实现吗? JS 在 iframe 中启动也会阻止托管页面 DOM 吗?
最佳答案
实际上,这将是使用 WebWorkers 的一个主要示例,但正如您正确提到的那样,您不会在那里引用 DOM。您唯一的选择就是将该流程分解为更小的任务。如果你能做到这一点,你需要问自己两个问题
- 较小的任务是否需要按顺序运行?
- 这些任务可以异步运行吗?
如果您对这两个问题的回答都为否,则可以设置失控脚本计时器并异步执行这些任务。示例:
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
包含的函数,但最多在 100ms 的时间范围内。这将确保浏览器和 UI 线程在处理过程中的阻塞时间不会超过 100 毫秒。因此,浏览器将保持响应。
关于用于 DOM 相关处理的 JavaScript 并行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13104381/