我正在使用NodeJS。
我的任务如下:
。
我面临的问题是如何根据用户第一次输入的“计数”来同步获取用户输入。
例如,如果有C++代码,我可以简单地循环“计数”并同步接受输入。
如何在NodeJS中实现相同的功能?
发布于 2020-08-11 08:29:28
由于Javascript异步-io事件循环体系结构,实现解决方案要复杂一些。在Javascript中有多种解决这个问题的方法,我已经为您提供了2种方法。
解决方案1
这是“旧”的做事方式。该解决方案使用callbacks和recursion。我不会用这个人,但这是操作JS事件循环的一个很好的例子。
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Enter inputs count: ", function (countRaw) {
// validate count
const count = parseInt(countRaw);
readMultipuleInputs(count, count, (res) => {
console.log(res)
rl.close();
})
});
function readMultipuleInputs(count, maxCount, cb) {
if (count == 0) {
cb([]);
}
const currentCount = maxCount-count+1;
rl.question(`Enter input (${currentCount}/${maxCount}): `, function (res) {
readMultipuleInputs((count - 1), maxCount, (accumulator) => {
accumulator.unshift(res);
cb(accumulator);
});
});
}
rl.on("close", function () {
console.log("\nBYE BYE !!!");
process.exit(0);
});解决方案2
这个解决方案是写JS的“现代”方式。它使用async和await来允许您将代码视为同步代码。
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on("close", function () {
console.log("\nBYE BYE !!!");
process.exit(0);
});
function rlQuestionPromise(message) {
return new Promise((resolve) => {
rl.question(message, resolve);
});
}
(async function run() {
const count = await rlQuestionPromise("Enter inputs count: ");
const accumulator = [];
for(let i = 0; i<count; i++ ){
const res = await rlQuestionPromise(`Enter input (${i+1}/${count}): `);
accumulator.push(res);
}
console.log(accumulator);
rl.close();
})()https://stackoverflow.com/questions/63351720
复制相似问题