You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:15:04