我的 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();
请注意,dosomething
和 dosomething3
将几乎连续触发,而 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/