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)
我认为这不符合你的期望.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执行之前完成.如果你的循环是无限的,那么它会创建一大堆需要在将来发生的调用,但不能,因为它们被循环阻塞.
如果我不得不猜测,似乎你正在实施某种长期的民意调查.如果那个东西是同步的(似乎不是),它可能更容易轮询它.如果不是,那么你将不得不考虑异步处理它.有回调,事件或承诺.
在等待事情发生的情况下,事件往往是你的朋友.您可以创建自定义事件或使用框架来帮助传播.
| 归档时间: |
|
| 查看次数: |
3472 次 |
| 最近记录: |