在JavaScript中循环通过一个巨大的数组

在JavaScript中循环通过一个巨大的数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我得到了这个提供商的回复,那里有一个巨大的、深入的阵列 我只需要循环这个数组并做一些简单的计算,但它需要相当长的时间来处理 使用JavaScript的最佳实践是什么?如果您将HTML5与现代浏览器结合使用,您可以使用WebWorkers: 或者你可以使用一种自己开发的方法:进行大量计算的最佳方法是启动一个WebWorker。请记住,将大型对象传输到worker的速度很慢,因此您可能希望在worker本身中获得响应(比如启动ajax) 如果只使用一个线程,可以使用下面的方法将计算分割成更小的部分,

我得到了这个提供商的回复,那里有一个巨大的、深入的阵列

我只需要循环这个数组并做一些简单的计算,但它需要相当长的时间来处理


使用JavaScript的最佳实践是什么?

如果您将HTML5与现代浏览器结合使用,您可以使用WebWorkers:


或者你可以使用一种自己开发的方法:

进行大量计算的最佳方法是启动一个WebWorker。请记住,将大型对象传输到worker的速度很慢,因此您可能希望在worker本身中获得响应(比如启动ajax)

如果只使用一个线程,可以使用下面的方法将计算分割成更小的部分,但是如果单个迭代花费的时间太长,这对您没有帮助

function eachAsync(array, fn) {
  return new Promise(function(resolve, reject) {
    var index = 0;
    function chunk() {
      try {
        var end = performance.now() + 20;
        for(;;) {
          if (index < array.length) {
            var current = index++;
            fn(array[current], current);
          } else {
            resolve();
            break;
          }
          if (performance.now() >= end) {
            schedule();
            break;
          }
        }
      } catch(e) {
        reject(e);
      }
    }
    function schedule() {
      setTimeout(chunk, 10);
    }
    schedule();
  });
}
函数eachAsync(数组,fn){
返回新承诺(功能(解决、拒绝){
var指数=0;
函数块(){
试一试{
var end=performance.now()+20;
对于(;;){
if(索引<数组长度){
var电流=指数++;
fn(阵列[当前],当前);
}否则{
解决();
打破
}
if(performance.now()>=end){
附表();
打破
}
}
}捕获(e){
拒绝(e);
}
}
功能表(){
setTimeout(块,10);
}
附表();
});
}

计算总是在某个深度的元素上进行,还是深度不同?@HunanRostomyan它是在某个深度上进行的;假设4。然后循环数组4次。。。使用一些计数器;在启动时对其进行初始化,然后将其从4减少到0。由于它被标记为
node.js
,我相信OP有更多的线程选项。@SteveWellens node.js最流行的选项是什么?从我发现的情况来看,
节点webworker线程
在其示例中的性能似乎不太令人印象深刻。@TuanAnhTran我不知道最流行的选项是什么。如果他们有点慢…谁在乎呢:他们在后台线程中。