2

我有一个资源消耗 DOM(浏览器)相关的 JavaScript 进程。启动时它会阻塞页面(其他与 DOM 相关的处理)。是否可以异步并行运行此过程,并在完成后将结果传递到主页?Web 工作者并非如此,因为进程与 DOM 一起工作。

这可以用 iframe 实现吗?JS 是否也在 iframe 阻止托管页面 DOM 中启动?

4

1 回答 1

4

实际上,这将是使用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 毫秒。因此浏览器将保持响应

于 2012-10-27T21:40:24.700 回答