最近想用js來寫一點簡單的算法題三圆,node是使用process.stdin和process.stdout來實現(xiàn)標準輸入和輸出的,我的目標是實現(xiàn)****循環(huán)輸入****浆劲,遇到?jīng)]有輸入時嫌术,輸入結束。聽起來好像很簡單牌借,那么接下來我們就來試試度气。
官方文檔
首先我們去看看官方文檔
process.stdin
代碼如下
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
運行這段程序,接著輸入膨报,結果如下磷籍,變成了無無限循環(huán)的輸入,無論怎么輸入都無法觸發(fā)'end'事件现柠。
Paste_Image.png
這是為什么呢院领?
我們繼續(xù)去查閱官方文檔
Paste_Image.png
文檔里寫著:當完成沒有內容輸入時就可以觸發(fā)'end'事件。
看到這里够吩,感覺前面的代碼并沒有錯比然,那么為什么他不會結束循環(huán)輸入呢?
我們把代碼修改如下:
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if(typeof chunk === 'string'){
process.stdout.write(`stringLength:${chunk.length}\n`);
}
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
運行結果如下:
Paste_Image.png
當輸入一個字符的時候字符串長度為3周循,之后都是字符串長度加2强法,這是什么原因呢?
你還記得你每次輸入結束之后都要敲的回車鍵嗎湾笛?回車鍵的字符就是'\n'
知道問題的原因就好解決了饮怯,既然加了回車字符,那么我們就將回車字符去掉嚎研,最簡單的方法當然是切片蓖墅。
chunk = chunk.slice(0,-2);
Paste_Image.png
現(xiàn)在的數(shù)據(jù)就沒問題了。
原代碼修改如下:
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if(typeof chunk === 'string'){
chunk = chunk.slice(0,-2);
process.stdout.write(`stringLength:${chunk.length}\n`);
}
if(chunk === ''){
process.stdin.emit('end');
return
}
if (chunk !== null) {
process.stdout.write(`data: ${chunk}\n`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
就可以做到當沒有輸入時觸發(fā)'end'事件临扮。
Paste_Image.png
如果要做字符串處理就在end事件內執(zhí)行论矾。