【问题标题】:Node.js readline inside of promises承诺中的 Node.js readline
【发布时间】:2018-06-08 11:49:08
【问题描述】:

我正在尝试使用 node.js 包 readline 在命令行上获取用户输入,并且我想通过 Promise 管道输入的输入。但是,输入永远不会通过 then 链。我认为问题可能出在回调方法中实现了承诺,但我不知道如何解决该问题。

这个问题的一个例子如下所示:

import rlp = require('readline');

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

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

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

如果在node.js中运行,问题会出现一次,输入后程序就停止了。我希望它等到输入第一个输入,然后它应该打印这个输入并请求下一个输入。

提前致谢!

【问题讨论】:

标签: node.js callback promise readline


【解决方案1】:

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

const rlp = require('readline');

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

});

function ask() {
    return new Promise((resolve, reject) => {
        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() });

【讨论】:

    【解决方案2】:

    这是here这个问题的答案,我不值得称赞。

    
    // 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));
      
      

      【讨论】:

        【解决方案4】:

        Node.js 17 is here with new promise-based APIs for readline module:

        import * as readline from 'node:readline/promises'
        import { stdin as input, stdout as output } from 'process'
        
        const rl = readline.createInterface({input, output})
        
        const answer = await rl.question('What do you think of Node.js? ')
        
        console.log(`Thank you for your valuable feedback: ${answer}`)
        
        rl.close()
        

        https://nodejs.org/api/readline.html#readline

        【讨论】:

          【解决方案5】:

          节点提示.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();
          

          【讨论】:

            猜你喜欢
            • 2018-04-05
            • 1970-01-01
            • 2017-05-17
            • 2015-04-15
            • 2016-05-12
            • 1970-01-01
            • 2014-07-04
            • 2018-05-29
            • 1970-01-01
            相关资源
            最近更新 更多