如何将typescript回调转换为promise

时间:2017-05-26 09:31:59

标签: mysql typescript promise


我想在班上做一个方法。此方法应连接到MySQL数据库。我创建了我的SQL代码。现在我不想回电,因为这已经过时了,我想开始使用承诺。

我的回调功能(旧学校):

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

提前致谢。

3 个答案:

答案 0 :(得分:1)

创建new Promise并在query的回调函数中解析/拒绝它。然后回复承诺。 now 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课程。这取决于你的环境。

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

答案 1 :(得分:0)

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

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

提示#3。请使用一些承诺库,例如BluebirdQ。大多数第三方承诺库都有许多有用的实用方法来处理它们的承诺是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);
}

答案 2 :(得分:0)

我编写了一个简单的npm软件包,以保留类型安全的方式进行此操作:

ts-promisify-callback

它要求您使用typescript@^4.0(即将发布的版本),并且当前仅适用于(err, result) => {}流行格式的回调。