2017-05-26 66 views
1


我想在我的班级中创建一个方法。这个方法应该连接到一个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

在此先感谢。

回答

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类可用。这取决于你的环境。

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

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); 
}