0

我的 JS 代码需要很长时间才能运行,所以它锁定了浏览器。

我可以将它与 分开setTimeout,那会起作用。但后来我需要重组我的代码。我认为,只要有一个好的库,就应该可以不重构代码(太多)。

那么,任何提供该功能的 js 库?像伪协程之类的东西?

出于兼容性原因,我不想使用 Web Workers。

编辑:有人问我 lib 会做什么。好吧,考虑一下这段代码。

dosomething();
for(var x=0; x<w; x++) {
    for(var y=0; y<h; y++) {
        dosomething2();
    }
}
dosomething3();

我可以使用 setInterval 将其拆分,因此在将控制权返回给浏览器之前,我只执行外部循环的 10 次迭代。但这需要大量重构代码。一个库可以做一些诡计让我更轻松地做到这一点。例如,在 C# 语言中,有可能——实际上有两种方式——生成器和 async 关键字。

4

1 回答 1

2

如果您使用服务器端语言为您进行数字运算呢?您可以向它发送所需的数据,它将被异步处理并在准备好时返回给客户端。

这是一种比依赖客户端的计算能力进行资源密集型计算更好的方法。

如果你必须让你的 JS 循环异步,方法如下:

dosomething();

function iterate(count) {
    count--;
    if (count > 0) {
        dosomething2();
        setTimeout(
        function() {
            iterate(count);
        }, 10); // iterates every 10 ms
    }
}
iterate(10); //runs the loop 10 times, asynchronously

dosomething3();

请注意,dosomethinganddosomething3将连续触发,而dosomething2迭代发生在后台。每个人都dosomething2锁定了界面,但由于它们不是连续发生的,所以没有问题。

另请注意,虽然我目前将迭代限制为每 10 毫秒 1 次,但您可以将其设置为 0 并仍然获得类似的结果。

这是一个演示:http: //jsfiddle.net/mW6vz/

于 2012-12-02T15:25:40.230 回答