Javascript堆内存不足错误

dge*_*s21 0 javascript node.js

我试图运行以下while循环,但由于某种原因我得到一个JS堆内存错误:

 while( typeof(apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p]) == 'undefined') {
    //create time delay of one second
    setTimeout(function(){
        //put code to run after delay here
        if( typeof(apiResults[0].league.season.eventType[0].events[0].pbp[i+1].pbpDetails[0]) != 'undefined') {
            //this will run if the next inning has come through
            i = i+1;
            p = 0;
        }
            //this will also pass the while loop and go down to the actual code
    }, 3000);
}
Run Code Online (Sandbox Code Playgroud)

我知道逻辑是有缺陷的,但是现在我只在if语句为真的情况下运行它.

我收到以下错误:

<---最后几个GC --->

11450 ms:标记扫描1388.5(1433.0) - > 1388.5(1445.0)MB,834.3/0.0 ms(标记开始后63步中+ 0.0 ms,最大步长0.0 ms)[分配失败] [清除可能不成功].12374 ms:标记扫描1400.2(1445.0) - > 1400.3(1445.0)MB,910.6/0.0 ms(自标记开始以来,188步中+ 0.1 ms,最大步长0.0 ms)[分配失败] [清除可能不成功].

<--- JS stacktrace --->
Cannot get stack trace in GC.
FATAL ERROR: MarkCompactCollector: semi-space copy, fallback in old gen Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/local/bin/node]
 2: node::FatalException(v8::Isolate*, v8::Local<v8::Value>, v8::Local<v8::Message>) [/usr/local/bin/node]
Run Code Online (Sandbox Code Playgroud)

kti*_*lcu 6

我认为这不符合你的期望.setTimeout获取传递它的函数,在延迟之后,将函数添加到堆栈之后的其他所有内容.由于while循环阻塞,最终会出现一种奇怪的情况,即在while循环结束之前不会调用延迟函数.

var x = 0;
while (x<10) {
  x++;
  console.log('omg');
  setTimeout(function(){console.log('from timeout');},0);
}
Run Code Online (Sandbox Code Playgroud)

您将在上面看到的是循环将继续,直到在任何setTimeouts执行之前完成.如果你的循环是无限的,那么它会创建一大堆需要在将来发生的调用,但不能,因为它们被循环阻塞.

如果我不得不猜测,似乎你正在实施某种长期的民意调查.如果那个东西是同步的(似乎不是),它可能更容易轮询它.如果不是,那么你将不得不考虑异步处理它.有回调,事件或承诺.

在等待事情发生的情况下,事件往往是你的朋友.您可以创建自定义事件或使用框架来帮助传播.