0

我正在尝试创建readlinewith的异步版本promisify

以这种方式使用的东西:

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

但是没有返回任何东西。任何的想法?

4

1 回答 1

3

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

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

Promisify仅适用于标准回调接口:

遵循常见的错误优先回调风格的函数,即将 (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)
于 2020-06-05T10:44:58.490 回答