【问题标题】:Problem with async/await while using .forEach使用 .forEach 时出现异步/等待问题
【发布时间】:2021-12-18 02:13:23
【问题描述】:

我正在做一个简单的Redis' 请求,它应该返回我数据库中的所有值(不是键)。问题是我的函数在.forEach 甚至开始之前返回tab。为什么我会知道?我的console.log(tab) 的结果在每次迭代的console.log(cards) 之前打印。 我的解释器还在.forEach 函数中告诉我"Promise returned from forEach argument is ignored"。 我在那里做错了什么?为什么 async/await 不能在 .forEach 内部工作?

router.get("/", async (req, res) => {
    try {
        const keys = await client.keys("*")
        //console.log(result)
        const tab = []
        await keys.forEach(async (key) => {
            const cards = await client.smembers(key)
            console.log(cards)
            tab.push(cards)
        })
        console.log(tab)
        return res.send(tab)
    } catch (err) {
        console.error(err)
    }

});

【问题讨论】:

  • forEach 没有返回承诺,这就是您收到该警告的原因。
  • reduce 或 map 怎么样?它会和他们一起工作吗?我想避免使用循环
  • 您仍将使用mapreduce 遍历数组。也许创建一个承诺数组并等待Promise.all

标签: javascript node.js redis


【解决方案1】:

forEach 不适用于异步函数。您可以改用for ... of 循环。

for(const key of keys){
    const cards = await client.smembers(key)
    console.log(cards)
    tab.push(cards)
}

【讨论】:

  • reduce 或 map 怎么样?它会和他们一起工作吗?我想避免使用循环
  • @crazyfrog 这些都不适用于async 函数或Promises。有时一个简单的for 循环是最简单的。
  • 进一步解释。虽然async foreach 在原始问题中运行,但观察到的结果是因为它只是在执行多个异步调用async 将与其余逻辑并行运行,这就是为什么他看到console.log(tab) 在他的async foreach 之前返回。正如此答案中所述,for of 是解决此问题的方法。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2015-07-27
相关资源
最近更新 更多