使用.forEach时async/await不生效及Redis批量查询提前返回问题
问题根因
Array.prototype.forEach是同步迭代方法,没有处理异步回调的逻辑,你传入的async函数返回的Promise会被直接丢弃,不会被等待执行完成。外层的await keys.forEach(...)实际上等价于await undefined,会立即继续执行后续代码,所以会先打印空的tab数组,之后才会执行完每个client.smembers的异步请求,这也是解释器提示「Promise returned from forEach argument is ignored」的原因。
修复方案
你可以用Promise.all配合Array.prototype.map实现并发异步请求,该方法会等待所有异步操作执行完成后再返回结果:
router.get("/", async (req, res) => { try { const keys = await client.keys("*") // map会收集所有异步请求返回的Promise,交给Promise.all批量等待 const tab = await Promise.all(keys.map(async (key) => { const cards = await client.smembers(key) console.log(cards) return cards })) console.log(tab) return res.send(tab) } catch (err) { console.error(err) return res.status(500).send('服务器内部错误') } });
补充说明
- 如果你需要按顺序串行执行异步请求,而非并发执行,可以使用
for...of循环,它天然支持await语法:
const tab = [] for (const key of keys) { const cards = await client.smembers(key) console.log(cards) tab.push(cards) }
- 生产环境不建议使用
client.keys("*")获取所有键,该命令为O(N)复杂度,当Redis存储的键数量较大时会阻塞整个Redis实例,影响其他业务请求,建议用SCAN命令迭代遍历所有键。
内容的提问来源于stack exchange,提问作者crazyfrog
相关产品推荐
相关产品推荐

