强制回调同步处理?

时间:2016-12-08 00:44:17

标签: javascript node.js

我正在使用以下代码:

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的最佳用例,如果是这样的话,我会很乐意确认。

我理解一种解决方案是将循环分解为多个较小的循环,在这个特殊用例中我不能这样做,它需要是一个长时间运行的循环。

1 个答案:

答案 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以推迟循环的其余部分,允许进行任何其他处理。