gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:03:38 28 4
gpt4 key购买 nike

我从 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com