Javascript 通过异步/等待从节点中的redis同步获取
几天来,我从Java学习Javascript和Vue,但无法通过async/await解决我的节点Express应用程序的问题。下面的代码从请求中接收股票符号列表,然后通过循环检查任何符号的详细信息是否已缓存在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 = [];
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-如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区指出这一点。这也会为你赢得一些遵循正确程序的声誉积分。