Node.js中的readline在promises中的应用

10
我正在尝试使用node.js包readline在命令行上获取用户输入,并希望通过promise管道传递输入,但是输入从未通过then链传递。我认为问题可能来自于promises在回调方法中被执行,但我不知道如何解决这个问题。
这个问题的一个例子看起来像这样:

import rlp = require('readline');

const rl = rlp.createInterface({
  input: process.stdin,
  output: process.stdout
});  

let prom = new Promise(resolve => {
  rl.question('Enter input: ', input => rl.close() && resolve(input));
});

prom
  .then(result => { console.log(result); return prom; })
  .then(result => { console.log(result); return prom; })
  .then(result => console.log(result));

如果在node.js中运行,问题将只会出现一次,输入完成后程序就会停止。我希望它能等待第一个输入完成,然后打印这个输入并要求下一个输入。
提前感谢!

你为什么要尝试重复使用同一个 Promise,而不是在 while 循环内创建一个新的 Promise?请看我在这里的答案 https://dev59.com/IGsz5IYBdhLWcg3wFT4f#46488389 - Wiktor Zychla
5个回答

22

承诺一旦得到解决,再等待就没有任何意义了。我还将rl.close()调用移至末尾,因为它只需要调用一次。

const rlp = require('readline');

const rl = rlp.createInterface({
  input: process.stdin,
  output: process.stdout
});

function ask() {
  return new Promise(resolve => {
    rl.question('Enter input: ', input => resolve(input));
  });
}

ask()
  .then(result => { console.log(result); return ask(); })
  .then(result => { console.log(result); return ask(); })
  .then(result => { console.log(result); rl.close() });

7

1
当我尝试使用 Promises 时,显示以下错误消息:无法找到模块“node:readline/promises”或其相应的类型声明。ts(2307) - Victor Guedes
@VictorGuedes; 你使用哪个版本的node.js?尝试使用import * as readline from 'readline/promises' - Mir-Ismaili

4

以下是我为您翻译的内容,这篇文章来自于此处,所有内容的贡献者与我无关。


// Function
function Ask(query) {
  const readline = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
  })

  return  new Promise(resolve => readline.question(query, ans => {
  readline.close();
  resolve(ans);
}))
}

 
// example useage
async function main() {

 var name = await Ask("whats you name")
 console.log(`nice to meet you ${name}`)

 var age = await Ask("How old are you?")
 console.log(`Wow what a fantastic age, imagine just being ${age}`)
}

main()

3

const readline = require('readline');

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const ask = (query) => new Promise((resolve) => rl.question(query, resolve));

ask('A: ').then(async (a) => {
  const b = await ask('B: ');
  const c = await ask('B: ');

  console.log(a, b, c);

  rl.close();
});

rl.on('close', () => process.exit(0));


0

node prompt.mjs

import { createInterface as createQuestionInterface } from 'readline';

const rl = createQuestionInterface({
  input: process.stdin,
  output: process.stdout
});

function questionLine(multiline, resolve, i, input, rl) {
  if (!multiline) {
    resolve(i);
  } else {
    if (input && !i) {
      resolve(input);
    } else {
      return input + i + "\r\n";
    }
  }
  return input;
}

function promptMultiLine(questionText) { // This is async by returning promise
  return prompt(questionText, true);
}

async function prompt(questionText, multiline = false) {
  return await (new Promise((resolve, reject) => {
    let input = '';
    rl.question(`${questionText}: `, (i) => {
      input = questionLine(multiline, resolve, i, input, rl);
    });
    rl.on('line', (i) => {
      input = questionLine(multiline, resolve, i, input, rl);
    });
  }));
}

async function run() {
  const question = prompt("please enter response [enter to complete]");
  console.log(question);
  const questionMultiLine = promptMultiLine("please enter response [enter text and enter twice]");
  console.log(questionMultiLine);
}

run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接