Javascript 通过异步/等待从节点中的redis同步获取

Javascript 通过异步/等待从节点中的redis同步获取,javascript,express,redis,Javascript,Express,Redis,几天来,我从Java学习Javascript和Vue,但无法通过async/await解决我的节点Express应用程序的问题。下面的代码从请求中接收股票符号列表,然后通过循环检查任何符号的详细信息是否已缓存在redis中 var controllers = { getCurrentPrice: function(req, res) { var symbolsArray = req.body.symbols; var results = [];

几天来,我从Java学习Javascript和Vue,但无法通过async/await解决我的节点Express应用程序的问题。下面的代码从请求中接收股票符号列表,然后通过循环检查任何符号的详细信息是否已缓存在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的通话,但并不能完全解决这个问题

这里有几件事不对:

  • .push()
    的结果执行
    等待
    ,没有任何用处。您可以使用
    等待
    实现承诺
  • 您的
    .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);
    });
    

    可能是您的承诺失败了,您是否尝试添加了
    .catch
    ?谢谢您的帮助。Redis呼叫中的另一个问题我可以通过这里提到的co-Redis解决-@RajMalhotra-如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区指出这一点。这也会为你赢得一些遵循正确程序的声誉积分。