【问题标题】:Node: asynchronous version of readline with util.promisify节点:带有 util.promisify 的异步版本的 readline
【发布时间】:2020-09-24 12:00:21
【问题描述】:

我正在尝试使用promisify 创建readline 的异步版本。

以这种方式使用的东西:

import { Cli } from '../services/Cli';

const cli = new Cli();

const main = async () => {
  await cli.question('What is your name ? ');
  await console.log('\nBYE');

  await process.exit(0);
};

这是我的尝试:

import { promisify } from 'util';
import readline from 'readline';

export class Cli {
  private cli;

  constructor() {
    this.cli = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
  }

  question(text: string) {
    return promisify(this.cli.question).call(this.cli, text);
  }
}

我为 mysql 拥有的其他包装器启发了我,它运行良好:

import { promisify } from 'util';
import mysql from 'mysql';
import config from '../../config.test.json';

export class MySQL {
  private mySQL;

  constructor() {

    this.mySQL = mysql.createConnection(config.database);
  }

  query(sql: string, args?: string | number | [] | {}) {
    return promisify(this.mySQL.query).call(this.mySQL, sql, args);
  }
}

// use it
this.mySQL = new MySQL();
const users = await this.mySQL.query("SELECT * FROM user");
return users

但是没有返回任何东西。有什么想法吗?

【问题讨论】:

  • 为什么是this.cli.question? readline 没有问题属性
  • 嗯,我关注了nodejs.org/en/knowledge/command-line/…,还以为有question的方法……?
  • 对不起,你说得对
  • 别担心! :)

标签: node.js asynchronous async-await node-promisify


【解决方案1】:

问题是由readline.question()函数的接口引起的:

传递给 rl.question() 的回调函数不遵循接受 Error 对象或 null 作为第一个参数的典型模式。使用提供的答案作为唯一参数调用回调。

Promisify works 只带标准回调接口:

按照常见的错误优先回调样式创建一个函数,即将 (err, value) => ... 回调作为最后一个参数,并返回一个返回承诺的版本。

你需要把它包装起来:

  question (text) {
    return new Promise(resolve => {
      this.cli.question(text, resolve)
    })
  }

然后

    const name = await cli.question('What is your name ? ')
    console.log(name)

【讨论】:

  • 嗯,有趣……比,我很困惑!
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2015-11-30
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多