使用:Node.js 8.x
目的:读取标准输入并将其存储在数组中
错误:最后一行没有保存在数组中。
我对javascript的误解是什么?异步和同步?
const promise = require('promise')
, readline = require('readline');
const stdRl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
GLOBAL_COUNTER_READLINE = 0;
GLOBAL_MAPSIZE = 0;
GLOBAL_MAPDATA = [];
stdRl.on('line', (input) => {
// first line : setMapSize
// second line ~ GLOBAL_MAPSIZE : appendMapDataRow
// GLOBAL_MAPSIZE + 1 line : getMapData, countChar
if (GLOBAL_COUNTER_READLINE == 0) {
// setMapSize;
GLOBAL_MAPSIZE = input;
console.log(`Map Size is : ${GLOBAL_MAPSIZE}`);
} else if (GLOBAL_COUNTER_READLINE != GLOBAL_MAPSIZE) {
// appendMapDataRow
GLOBAL_MAPDATA.push(input);
} else if(GLOBAL_COUNTER_READLINE == GLOBAL_MAPSIZE){
//getMapData
for (var row = 0; row < GLOBAL_MAPDATA.length; row++) {
console.log(`${GLOBAL_MAPDATA[row]}`);
}
stdRl.close();
}
GLOBAL_COUNTER_READLINE++;
});
javascript太棒了,但对我来说很难。
答案 0 :(得分:3)
您的主要问题是,由于行数是您阅读的第一个值,因此您不应该实际递增计数器。一旦实际收到第一行数据,就应该开始递增。
if (GLOBAL_MAPSIZE == 0) {
GLOBAL_MAPSIZE = input;
console.log(`Map Size is : ${GLOBAL_MAPSIZE}`);
} else if (GLOBAL_COUNTER_READLINE < GLOBAL_MAPSIZE) {
GLOBAL_MAPDATA.push(input);
GLOBAL_COUNTER_READLINE++; // <-- move the increment here
} else {
for (var row = 0; row < GLOBAL_MAPDATA.length; row++) {
console.log(`${GLOBAL_MAPDATA[row]}`);
}
stdRl.close();
}
另一个潜在的未来问题是您实例化对象,但将它们用作原始值。
Number
的两个实例永远不会相等:
console.log(
new Number(0) == new Number(0) // false
)
&#13;
因为对象是通过引用相等性进行比较的(基本上检查它们是否是同一个实例;如果它们引用内存中的同一个对象)。
您可以比较他们的值:
console.log(
new Number(0).valueOf() == new Number(0).valueOf() // true
)
&#13;
但是使用原始原语要简单得多。
console.log(
0 == 0 // true
)
&#13;
所以在你的代码中:
GLOBAL_COUNTER_READLINE = 0;
GLOBAL_MAPSIZE = 0;
GLOBAL_MAPDATA = [];