【问题标题】:Node.js - promisify readlineNode.js - 承诺 readline
【发布时间】:2018-04-05 02:06:29
【问题描述】:

正如标题所述,我想知道是否可以在 node.js 中将promisify (https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original) 用于readline?我只能这样做:

let data = [];
const parse = () => {
    return new Promise((resolve, reject) => {

        const rl = readline.createInterface({
            input: fs.createReadStream(path)
        });

        rl.on('line', (line) => {
            data.push(line);
        });

        rl.on('close', () => {
            resolve(data);
        });
    });
};

【问题讨论】:

  • 您只能承诺错误优先回调,并使用promisify.custom 其他不遵循模式的回调类型。对于流和事件发射器,您需要实现自己的逻辑,它确实共享一个通用接口(@98​​7654327@,finish),但用例非常不同。
  • 是的,这就是我的怀疑。我的实施是否足够?
  • 你的实现的问题是你在比你的承诺更高的范围内添加了data,它会为每次使用parse积累数据,如果你使用parse承诺​​2次,第二次使用将附加第一个值,然后也附加第二个值。更好的方法是在 promise 中设置let data,这样每次使用时您将只存储新数据。
  • 你说的对,我完全忘记了!

标签: javascript node.js promise


【解决方案1】:

尝试使用创建http://bluebirdjs.com/docs/api/promise.promisifyall.html的bluebird

但如果代码有效。那么我认为您不需要承诺,因为您已经将其作为承诺返回。

【讨论】:

    【解决方案2】:

    这是我如何承诺readline.question 的示例:

    const rl = require('readline');
    const { promisify } = require('util');
    const readline = rl.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    // Prepare readline.question for promisification
    readline.question[promisify.custom] = (question) => {
      return new Promise((resolve) => {
        readline.question(question, resolve);
      });
    };
    
    // Usage example:
    (async () => {
      const answer = await promisify(readline.question)('What is your name? ');
      readline.close();
      console.log('Hi %s!', answer);
    })();
    

    自定义承诺功能的节点 (v8) 文档:https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_custom_promisified_functions

    【讨论】:

      【解决方案3】:

      在这里,您还有另一种方法。它没有使用promisify,我认为更简单:

      const readline = require('readline').createInterface({
          input: process.stdin,
          output: process.stdout
      });
      
      function question(query) {
          return new Promise(resolve => {
              readline.question(query, resolve);
          })
      }
      
      async function main() {
          const name = await question('Whats your name? ');
          console.log(`hello ${name}!`);
          readline.close();
      }
      
      main();
      

      【讨论】:

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