Использование Memcache и Mysql вместе

Использую модули mysql2 и memcached

Хочу делать запросы в бд если нужное не найдено в Memcache, но так как запросы асинхронные приходится использовать callback для mysql, но тогда код внутри не выполнится если запрос не будет произведен. То есть получается подобная конструкция (упрощено и без условий на наличие):

memcached.getMulti(['processed_msg'], function (err, data) {
   connection.query('SELECT * FROM `users` WHERE id = ? ', [Id], function (error, results, fields) {
    ...код обработки
   });
});

Думаю смысл понятен. Как переделать так чтоб реализовать задуманное?


Ответы (1 шт):

Автор решения: Red Woolf

Похоже вариантов кроме использования Promise API нету. Код с использованием промисов:

(async() => {
    let data = await new Promise((resolve, reject) => {
        memcached.getMulti(['processed_msg'], function (err, data) {
           if(err) reject(err);
           if(data) resolve(data);
        });
    });
    if(!data){
        data = await new Promise((resolve, reject) => {
            connection.query('SELECT * FROM `users` WHERE id = ? ', [Id], function (error, [results], fields) {
               reject(error);
               resolve(results);
            });
        });
    }
    console.log(data);
})();
→ Ссылка