stdin 上有一个传入数据的事件,称为 "data"
process.stdin.on("data", (data) => {} );
- 虽然某些应用程序会逐行处理输入,但其他应用程序的交互性更强,可以实时处理按键操作(例如,通过箭头键在列表中上/下移动)。
- 虽然某些应用程序需要纯文本,但其他应用程序将使用二进制数据。
有多种可能的情况,您在这里几乎可以靠自己。
我通常会创建一个InputReader,它只是缓冲所有输入并将其转换为适合我特定用例的事件。
下面是阅读器的最基本示例之一,每次接收到一行文本时都会触发事件。
export class DataReader {
private buffer = "";
constructor(private listener: (err, line: string)=>any ) {
}
processData(data) {
// remove carriage returns, and add data to the buffer.
data = data.toString().replace(/\r/g, '');
this.buffer += data;
// get only the complete data.
const lastNewlineIndex = this.buffer.lastIndexOf('\n');
if (lastNewlineIndex < 0) return;
if (this.listener != null) {
// split data in lines
const completeData = this.buffer.slice(0, lastNewlineIndex);
const lines = completeData.split('\n');
for (const line of lines) {
// notify listener line by line.
this.listener(null, line);
}
}
// remove processed data from the buffer.
this.buffer = this.buffer.slice(lastNewlineIndex + 1);
}
}
实际上,您可以使用EventEmitter 或一些Observable 调度输出。
const reader = new DataReader((err, line) => subject.next(line));
process.stdin.on("data", (data) => reader.processData(data));