Синхронная выборка из redis в Node через async / await - PullRequest
0 голосов
/ 09 ноября 2019

Я изучаю Javascript и Vue из Java за несколько дней и не могу решить проблему с моим приложением Node, Express через async / await. Приведенный ниже код получает список символов Stock из запроса, а затем проверяет в цикле, если сведения о каком-либо из символов уже кэшированы в redis.

var controllers = {
   getCurrentPrice: function(req, res) {
        var symbolsArray = req.body.symbols;
        var results = [];
        var tmpArray = [];

        _(symbolsArray).each( async function(symbol, iPos) {
            client.hget("realtime", symbol, function(err, reply)    {
                if(reply)   {
                    await results.push(reply);
                } else  {
                    await tmpArray.push(symbol);
                }
                console.log("reply", reply);
            });
        });
        console.log("Results so far ", results);
        if( !tmpArray || tmpArray.length == 0 ) { //will be fetching these now }
    }
}

Получение вывода во внутренней консоли, но не для внешней. Я пытался посмотреть на несколько решений через сеть, например, через redis-co, чтобы обещать вызовы redis, но не смог точно их решить.

1 Ответ

0 голосов
/ 10 ноября 2019

Здесь есть несколько неправильных вещей:

  1. Выполнение await с результатом .push() не делает ничего полезного. Вы используете await в обещании.
  2. Ваш цикл .each() не ожидает завершения каждой асинхронной операции, поэтому у вас нет возможности узнать, когда все асинхронные операции выполнены

Я бы предложил использовать обычный цикл for, где async/await приостановит цикл:

const util = require('util');
client.hgetP = util.promisify(client.hget);

var controllers = {
   getCurrentPrice: async function(req, res) {
        var symbolsArray = req.body.symbols;
        var results = [];
        var tmpArray = [];

        for (let symbol of symbolsArray) {
            let reply = await client.hgetP("realtime", symbol);
            if (reply) {
                results.push(reply);
            } else {
                tempArray.push(symbol);
            }
        }

        // do any further processing of tempArray here

        console.log(results);
        return results;    // this will be the resolved value of the returned promise
    }
}

Пример использования:

obj.getCurrentPrice.then(results => {
     console(results);
}).catch(err => {
     console.log(err);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...