user7975901
user7975901

Reputation:

How can i convert typescript callback to promise


i want to make a method in my class. This method should connect to a MySQL database. I created my SQL code. And now I don't want to do a callback because this is old, I want to start using promises.

My function with callback (old school):

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

And here follows the method I tried to make a promise, but I failed:

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

When I call this method:

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

I hope someone can help me. Because I really don't want to be old school forever xD

Thanks in advance.

Upvotes: 1

Views: 2285

Answers (3)

NSjonas
NSjonas

Reputation: 12032

I wrote a simple npm package to do this in a way that retains type-safety:

ts-promisify-callback

It requires you use typescript@^4.0 (upcoming release) and currently only works for callbacks in the popular format of (err, result) => {}.

Upvotes: 1

Lukas Neicelis
Lukas Neicelis

Reputation: 438

Tip #1. Please use some kind of factory function to build your connection and reuse it later on.

Tip #2. Use prepared statement to prevent SQL injection.

Tip #3. Please use some promise library for that like Bluebird or Q. Most of the 3rd party promise libraries have a lot of useful utility methods to work with promises on of them is promisify. Promisify can wrap any nodejs type callback function into function which returns a promise. Your example would look like:

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

Upvotes: 1

Luke
Luke

Reputation: 8407

create a new Promise and resolve it / reject it in the callback functions of query. then return the promise. now does_player_exist returns a Promise object which contains for example then function

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

you will have to make sure that you have a Promise class available. that depends on your environment.

please be aware that without sanitizing your input (username) your application will be vulnerable and attackers could hijack your app.

Upvotes: 3

Related Questions