javascript - Node中通过async/await从redis同步获取

标签 javascript express redis

我从 Java 学习 Javascript 和 Vue 已经好几天了,但无法通过异步/等待解决我的 Node、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 来 promise redis 调用,但无法完全解决它。

最佳答案

这里有几个问题:

  1. .push() 的结果执行 await 不会做任何有用的事情。您对 Promise 使用 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);
});

关于javascript - Node中通过async/await从redis同步获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782608/

相关文章:

node.js - 使用模式方法在 Mongoose For 循环中保存项目

node.js - 如何在 mongoDB 中减去 2 个操作?

python - 使用 redis-py 批量填充 redis 列表

laravel-5 - 在没有命令行监听器的情况下在 Laravel 5 中运行排队作业?

javascript - HTML 表单操作到 python > 如何从浏览器保存由 python 生成的本地文件

javascript - 有没有一种更简洁的方法可以将方法绑定(bind)到 Javascript 中的对象?

node.js - 在执行异步函数之前呈现的 Express JS 页面

javascript - 异步函数不返回 json 对象

javascript - jQuery 和 CSS 选择器

javascript - 在 JQuery bool 属性之间切换