javascript - JS冗长计算: split it up with a good syntax?

标签 javascript performance coroutine

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

我可以用setTimeout将其分开,这样就可以了。但随后我需要重组我的代码。我认为,只要有一个好的库,就应该可以在不重构代码(太多)的情况下实现。

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

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

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

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

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

最佳答案

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

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

如果您必须使 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 都会锁定接口(interface),但由于它们不是连续发生的,因此不会出现问题。

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

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

关于javascript - JS冗长计算: split it up with a good syntax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670273/

相关文章:

javascript - 如何使这些表格单元格可排序?

javascript - Object.defineProperties() 中的自引用

javascript - 如何将点击事件收集的数据添加到表单中?

performance - 在磁盘/流图分区算法上存储非常大的图?

Kotlin 协程:在 Sequence::map 中调用 Deferred::await

javascript - 使用 angularjs 将数据附加到 json-ld

python - 加速一个计算巨大数组中邻居平均值的程序

python - 加快 Pandas 中自回归项的创建?

android - 如何在 Android ViewModel 中等待多个作业?

c++ - 协程和带有静态变量的函数有什么区别?