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

Javascript JS冗长的计算:用一个好的语法将其拆分?,javascript,performance,coroutine,Javascript,Performance,Coroutine,我的JS代码需要很长时间才能运行,因此它会锁定浏览器 我可以用setTimeout将其拆分,这样就行了。但是我需要重新构造我的代码。我认为,如果有一个好的库,在不重新构造代码(太多)的情况下,这应该是可能的 那么,任何提供该功能的js库?类似于伪协程的东西 出于兼容性原因,我不想使用Web Workers 编辑:有人问我lib会做什么。嗯,考虑一下这个代码。 dosomething(); for(var x=0; x<w; x++) { for(var y=0; y<h; y

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

我可以用
setTimeout
将其拆分,这样就行了。但是我需要重新构造我的代码。我认为,如果有一个好的库,在不重新构造代码(太多)的情况下,这应该是可能的

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

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

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

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

对于(var x=0;x如果您使用服务器端语言为您进行数字运算,会怎么样?您可以将所需的数据发送给它,它将被异步处理,并在客户机准备就绪时返回给客户机

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

如果您必须使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();
请注意,
dosomething
dosomething3
将在附近连续发射,而
dosomething2
迭代在后台发生。每个
dosomething2
都会锁定接口,但由于它们不是连续发射,因此没有问题

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


下面是一个演示:

您要向我们展示您的代码吗?也许可以解释为什么它会锁定浏览器(“因为它正在运行且速度很慢”不是一个解释)?告诉我们,至少,它是做什么的?你希望这个库做什么?点击一个按钮,我会启动一个长循环,进行一些数字运算-图像处理。因此,由于这个循环在相当长的一段时间内没有返回,浏览器会等待它,不会更新UI。如果你不想,你可以尝试使用回调函数如果你太想重新构造你的核心(因为它太大/太复杂),那么webworkers就会这么做。如果你不能使用它,那么你应该给我们看一段你的
dosomething2()
code;也许我们可以帮你让它运行得更快。猜猜看:你的“图像处理”是什么对通过
getImageData()获取的图像字节进行迭代的代码。