有人可以用这种语法帮助我吗?

时间:2017-01-09 18:54:37

标签: javascript node.js stdin

这可能很傻,但我不熟悉这里的语法:

var stdin = '';
process.stdin.on('data', function (chunk) {
  stdin += chunk;
}).on('end', function() {
  var lines = stdin.split('\n');
  for(var i=0; i<lines.length; i++) {
    process.stdout.write(lines[i]);
  }
});

我应该编写一个对数字进行正方形的程序,我知道该怎么做,但我从来没有遇到过这种类型的结构。我理解循环,process.stdout.write基本上是console.log测试用例输入是5和25.输出应该是25和625.

我应该在哪里编写代码来执行此操作?

2 个答案:

答案 0 :(得分:2)

您可以将其放在文件sample.js中并运行它:

node sample.js

这个process.stdin引用stdin流(来自其他应用程序的传入数据,例如shell输入,基本上就是这样:

process.stdin.on('data', function (chunk) {
  stdin += chunk;
})

说,每当有新的data(用户在控制台中键入内容,托管应用程序发送一些数据)时,请将其读取并存储在stdin变量中。然后,当stdin流结束时(例如,用户完成输入数据):

.on('end', function() {
  var lines = stdin.split('\n');
  for(var i=0; i<lines.length; i++) {
    process.stdout.write(lines[i]);
  }
})

代码输出用户键入的内容。

答案 1 :(得分:1)

看来所有的基础设施都在那里。剩下的就是实际调整你的数字。

process.stdinprocess.stdoutnode streams,它们是异步的,所以使用事件来告诉你它们发生了什么。 data是有数据准备好处理的事件,而end是没有更多数据的事件。代码只是snarfs process.stdin然后,一旦数据全部在内存中,就会处理它。

end匿名函数可能最好像这样实现:

function() {
  stdin.split('\n').foreach(function(line){
     var value = line.trim()|0;
     process.stdout.write(value * value);
  });
}

偏离主题:可以通过处理流来处理流而不是收集流然后立即处理它来改善内存占用。这取决于输入和输入缓冲区的大小:

var buffer = '';
var outputSquare = function(line) {
  var value = line.trim()|0;
  process.stdout.write(value * value);
};
process.stdin.on('data', function (chunk) {
  var lines = (buffer + chunk).split('\n');
  buffer = lines.pop();
  lines.foreach(outputSquare);
}).on('end', function() {
  outputSquare(buffer);
});