最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

问打字稿许多问题

IT培训 admin 6浏览 0评论

问打字稿许多问题

我试图建立一个简单的命令行应用打字稿,但我不知道该怎么做一些事情。我发现这段代码在这里,在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”。你也可以使用,而(真),而不是为(...),以无限循环运行它。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论