Допустим я использую node-mysql из npm для выполнения sql-запросов. С появлением node 7 и поддержки ней async/await, хотелось бы понять, как можно применить это для выполнения sql запросов? Задача в целом написать класс-обертку для node-mysql, чтобы потом можно было делать нечто вроде:
let data = new MySqlWrapper().select(query);
ну и в итоге в data мы имеем результат выполнения запроса.
Подскажите как можно реализовать это на данном примере:
(async () => {
let getData = async ()=> {
db.query(`select * from users`,null,(err,data) =>{
console.log('ok');
return data;
});
};
var res = await getData();
//нужно чтобы в res пришли данные запроса
})();
Конструкции async/await отлично работают не только с асинхронными функциями, но и с Обещаниями (Promises). Например, код
let select = function(query) {
return new Promise(function(resolve, reject) {
setTimeout(() => {resolve(`${query}s`)}, 1000);
});
};
async function run() {
let foos = await select('foo');
let bars = await select('bar');
console.log(`${foos} + ${bars}`);
}
run();
выведет сообщение foos + bars через две секунды.
Эта маленькая хитрость позволит вам решить вашу проблему "малой кровью". Вы можете использовать одну из существующих библиотек, чтобы заставить ваши методы возвращать Обещания. Приведу пример того, это можно сделать используя Bluebird:
let bluebird = require('bluebird'),
asyncWrapper = (f, ctx) => bluebird.promisify(f, {context: ctx});
let mysql = new MySql();
let data = await asyncWrapper(mysql.select, mysql)(query);
При желании, вы можете написать класс, содержащий в себе новый, асинхронный API. Но эта задача тривиальна и я оставлю ее для вас :)
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости