通过异步/等待从Node中的Redis同步获取

几天以来,我正在从Java学习Javascript和Vue,但无法通过async / await解决我的Node,Express应用程序的问题。下面的代码接收来自请求的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的调用,但是并不能完全解决它。

wssfeng8287 回答:通过异步/等待从Node中的Redis同步获取

这里有几处错误:

  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);
});
本文链接:https://www.f2er.com/3131625.html

大家都在问