JS冗长的计算:用一个好的语法将它拆分?

时间:2012-12-02 14:37:18

标签: javascript performance coroutine

我的JS代码需要很长时间才能运行,因此它会锁定浏览器。

我可以将其与setTimeout分开,这样可行。但后来我需要重构我的代码。考虑到一个好的库,我认为应该可以在不重组代码的情况下(太多)。

那么,提供的任何js lib?像伪协程一样的东西?

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

编辑:我被问到lib会做什么。好吧,请考虑这段代码。

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

我可以使用setInterval将其拆分,所以我只在外部循环中进行10次迭代,然后再将控制权返回给浏览器。但这需要重新调整代码。 lib可以做一些技巧让我更容易做到。例如,在C#lang中,它可能 - 实际上有两种方式 - 生成器和async关键字。

1 个答案:

答案 0 :(得分: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();

请注意,dosomethingdosomething3会连续触发,而dosomething2次迭代会在后台发生。每个人dosomething2锁定界面,但由于它们没有连续发生,因此没有问题。

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

以下是演示:http://jsfiddle.net/mW6vz/