我的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关键字。
答案 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();
请注意,dosomething
和dosomething3
会连续触发,而dosomething2
次迭代会在后台发生。每个人dosomething2
锁定界面,但由于它们没有连续发生,因此没有问题。
另请注意,虽然我目前每10毫秒将迭代限制为1,但您可以将其设置为0并仍然可以获得类似的结果。