2017-05-26 41 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); 
}