我正在使用以下代码:
for (var x = 1; x < 10000000; x++) {
count++
myObj.name = count
ch.sendToQueue(queueName, new Buffer(JSON.stringify(myObj)));
}
如果我注释掉sendToQueue命令它完成没有错误,如果我没有注释它我得到错误:致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足。我相信这种情况正在发生,因为它将我的sendToQueue调用添加到回调队列中,这些内存会占用内存,直到没有内存为止。
有没有办法强制回调同步运行,因此它们不会构建?
我猜这可能不是Node / JavaScript的最佳用例,如果是这样的话,我会很乐意确认。
我理解一种解决方案是将循环分解为多个较小的循环,在这个特殊用例中我不能这样做,它需要是一个长时间运行的循环。
答案 0 :(得分:0)
是的,你是对的,正如@jfriend00所说,如果你sendToQueue
推迟退出循环,其他任何JS代码都不会被执行。但是你可以将循环组合在一起。这样的事情应该有效。
function chunkedLoop(from, to, step, cb) {
var i = 0;
for (var i = 0; from < to && i < step; from++, i++) {
cb(from);
}
if (from < to) {
setTimeout(chunkedLoop.bind(null, from, to, step, cb));
}
}
chunkedLoop(0, 10, 3, function(i) { console.log(i); });
每个step
项,运行setTimeout
以推迟循环的其余部分,允许进行任何其他处理。