问打字稿许多问题
我试图建立一个简单的命令行应用打字稿,但我不知道该怎么做一些事情。我发现这段代码在这里,在StackOverflow的:
import * as readline from 'readline';
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Is this example useful? [y/n] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
default:
console.log('Invalid answer!');
}
rl.close();
});
它工作得很好。有没有什么办法可以循环呢?什么实际上,我试图做的是获取从MySQL数据库中的一些问题,但我不知道如何问一个问题N次。谢谢!
回答如下:因为函数调用是异步的把readline的一个循环是不够的。这意味着节点不会等待用户输入的东西。而是用户输入将触发一个事件和回调函数“(答案)=> {...}”将得到执行。
要明白,节点是异步的,事件驱动是很重要的。函数的每一个同步执行可能会阻止事件循环,使节点响应。
一种可能性是在回调中使用递归。另一种选择是异步/ AWAIT这给代码执行synchronuous的结构。第三种可能性是使用事件(这可能是最好的解决方案),它可以在页面中的节点文档底部(https://nodejs/api/readline.html#readline_example_tiny_cli)可以看出。
也许是你的代码启动时最简单的方法就是使用递归功能(功能末自称):
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function ask() {
rl.question('Is this example useful? [y/n/q] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
case 'q':
console.log('Bye!');
rl.close();
process.exit();
default:
console.log('Invalid answer!');
}
ask();
});
}
ask();
请注意,这更是一个方法,使很简单的东西。也有对这样的事情强大的软件包。例如https://www.npmjs/package/commander。
这里是没有递归但承诺和异步/等待相同:
async function ask() {
return new Promise(resolve => {
rl.question('Is this example useful? [y/n/q] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
case 'q':
console.log('Bye!');
rl.close();
process.exit();
default:
console.log('Invalid answer!');
}
resolve();
});
});
}
async function start() {
for (let i = 0; i < 5; i++) {
await ask();
}
rl.close();
}
start();
这会问五个问题(我<5),然后退出。它也将退出当输入为“Q”。你也可以使用,而(真),而不是为(...),以无限循环运行它。
问打字稿许多问题
我试图建立一个简单的命令行应用打字稿,但我不知道该怎么做一些事情。我发现这段代码在这里,在StackOverflow的:
import * as readline from 'readline';
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Is this example useful? [y/n] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
default:
console.log('Invalid answer!');
}
rl.close();
});
它工作得很好。有没有什么办法可以循环呢?什么实际上,我试图做的是获取从MySQL数据库中的一些问题,但我不知道如何问一个问题N次。谢谢!
回答如下:因为函数调用是异步的把readline的一个循环是不够的。这意味着节点不会等待用户输入的东西。而是用户输入将触发一个事件和回调函数“(答案)=> {...}”将得到执行。
要明白,节点是异步的,事件驱动是很重要的。函数的每一个同步执行可能会阻止事件循环,使节点响应。
一种可能性是在回调中使用递归。另一种选择是异步/ AWAIT这给代码执行synchronuous的结构。第三种可能性是使用事件(这可能是最好的解决方案),它可以在页面中的节点文档底部(https://nodejs/api/readline.html#readline_example_tiny_cli)可以看出。
也许是你的代码启动时最简单的方法就是使用递归功能(功能末自称):
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function ask() {
rl.question('Is this example useful? [y/n/q] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
case 'q':
console.log('Bye!');
rl.close();
process.exit();
default:
console.log('Invalid answer!');
}
ask();
});
}
ask();
请注意,这更是一个方法,使很简单的东西。也有对这样的事情强大的软件包。例如https://www.npmjs/package/commander。
这里是没有递归但承诺和异步/等待相同:
async function ask() {
return new Promise(resolve => {
rl.question('Is this example useful? [y/n/q] ', (answer) => {
switch(answer.toLowerCase()) {
case 'y':
console.log('Super!');
break;
case 'n':
console.log('Sorry! :(');
break;
case 'q':
console.log('Bye!');
rl.close();
process.exit();
default:
console.log('Invalid answer!');
}
resolve();
});
});
}
async function start() {
for (let i = 0; i < 5; i++) {
await ask();
}
rl.close();
}
start();
这会问五个问题(我<5),然后退出。它也将退出当输入为“Q”。你也可以使用,而(真),而不是为(...),以无限循环运行它。