【问题标题】:How can i convert typescript callback to promise我如何将打字稿回调转换为承诺
【发布时间】:2020-08-07 13:37:52
【问题描述】:


我想在我的课堂上做一个方法。此方法应连接到 MySQL 数据库。我创建了我的 SQL 代码。现在我不想做回调,因为这是旧的,我想开始使用 Promise。

我的回调函数(老派):

public does_player_exist(username: string, callback: any) {
    this.mysql.connect();
    this.mysql.query('USE devdb');
    this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'"', (err: Error, result: any[]) {
        if (result.length === 1) {
            callback(true)
        } else {
            callback(false);
        }
    });
}

下面是我试图做出承诺的方法,但我失败了:

public does_player_exist(username: string): Promise<boolean> {
    this.mysql.connect();
    this.mysql.query('USE devdb');
    return this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'").toPromise().then((result) => {
        return result.length === 1;
    })
}

当我调用这个方法时:

service.does_player_exist('test').then((result) => { console.log(result) })

我希望有人可以帮助我。因为我真的不想永远做老派xD

提前致谢。

【问题讨论】:

    标签: mysql typescript promise


    【解决方案1】:

    创建一个new Promise 并在query 的回调函数中解决/拒绝它。然后返回承诺。现在does_player_exist 返回一个Promise 对象,其中包含例如then 函数

    public does_player_exist(username: string, callback: any): Promise<boolean> {
        this.mysql.connect();
        this.mysql.query('USE devdb');
        var promise = new Promise<boolean>();
        this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'"', (err: Error, result: any[]) {
            if (!err) promise.resolve(!!result.length);            
            else promise.reject();
        });
        return promise;
    }
    

    你必须确保你有一个可用的Promise 类。这取决于您的环境。

    请注意,如果不清理您的输入(用户名),您的应用程序将容易受到攻击,攻击者可能会劫持您的应用程序。

    【讨论】:

      【解决方案2】:

      提示 #1。请使用某种工厂函数来建立您的连接并在以后重用它。

      提示 #2。使用prepared statement 防止SQL 注入。

      提示 #3。请为此使用一些承诺库,例如 BluebirdQ。大多数 3rd 方 Promise 库都有很多有用的实用方法来使用 Promisify。 Promisify 可以将任何 nodejs 类型的回调函数包装到返回 Promise 的函数中。 您的示例如下所示:

      // it's not a factory function*
      public query() {
          this.mysql.connect();
          this.mysql.query('USE devdb');
      
          return Promise.promisify(this.mysql.query.bind(this.mysql))
      }
      
      public does_player_exist(username: string): Promise<boolean> {
          return this
              .query('SELECT p_name FROM players WHERE p_name = ?', [username])
              .then(result => result.length === 1);
      }
      

      【讨论】:

      • Promisify 是内置的节点,不需要外部库。 import { promisify } from 'util'
      • 没错,现在是
      【解决方案3】:

      我编写了一个简单的 npm 包,以保持类型安全的方式做到这一点:

      ts-promisify-callback

      它要求您使用typescript@^4.0(即将发布),目前仅适用于流行格式(err, result) =&gt; {}的回调。

      【讨论】:

        猜你喜欢
        • 2018-05-04
        • 2020-06-02
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2022-12-19
        相关资源
        最近更新 更多