javascript - Node.js Stream,是在这段代码中工作的 Drain

标签 javascript node.js

我正在尝试使用以下程序写入一个大文件

// this program will result in "JavaScript heap out of memory"
const fs = require('fs');

const printer = function () {
  const fil = fs.createWriteStream('./file');
  let i = 0;

  const writer = function () {
    while (i < 1e6) {
      if(fil.write("Hello man\n")) {
        i += 1;
        // console.log(i);
      }
      else {
        fil.once('drain', writer);
      }
    }
  }

  return writer;
}

const printty = printer();
printty();

我不明白为什么这个程序不以 block 的形式写入数据。而且计数似乎停留在 1638 左右。任何想法?谢谢。

最佳答案

您正在同步循环中调用drain并立即继续写入。你必须给它时间来执行。

一个简单的return就可以解决这个问题:

const fs = require('fs');

const printer = function () {
  const fil = fs.createWriteStream('./file');
  let i = 0;

  const writer = function () {
    while (i < 1e6) {
      if(fil.write("Hello man\n")) {
        i += 1;
      }
      else {
        fil.once('drain', writer);
        return; // give the drain time to execute
      }
    }
  }

  return writer;
}

const printty = printer();
printty();`

关于javascript - Node.js Stream,是在这段代码中工作的 Drain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45398101/

相关文章:

json - 将新项目推送到 JSON 数组中

javascript - 使用下一个和上一个按钮从 JSON 文件播放 HTML5 视频

javascript - 如何在 Kynetx 规则中正确发出 javascript?

javascript - 如何将 ngMouseMove 事件计算与我的 div 对齐

javascript - 如何切换变量格式不一致的大小写

javascript - 如何重定向到 node.js 中的另一个页面

javascript - 如何使用 PhantomJS 更改选择值

javascript - 插入数组?

javascript - 使用 PHP 将异常返回到 javascript FETCH API

Javascript string.match 拒绝返回包含多个匹配项的数组