【问题标题】:How to run SQL query with inside a javascript loop(map)?如何在 javascript 循环(地图)中运行 SQL 查询?
【发布时间】:2020-06-23 01:41:55
【问题描述】:

我想做的是:

  • 使用 map 函数遍历对象数组
  • 根据对象运行多个 SQL 查询
  • 使用对象附加查询结果

我正在遍历作为对象数组的 offer。我得到了与 offer 相关联的 free_itembuy_item。我正在使用 knexjs 用于带有 nodejs 的 postgresql 数据库

这是实际代码:

offers = await Promise.all(offers.map(async offer => {
        free_item_id = await db("offer_free_items").where({"offer_free_items.offer_id":offer.id}).select(["item_id"]).first()
        console.log("-----------------debug line 1------------------")

        buy_item_id = await db("offer_buy_items").where({"offer_buy_items.offer_id":offer.id}).select(["item_id"]).first()
        console.log("-----------------debug line 2-------------------")

        offer["free_item_id"] = get_item_id
        offer["buy_item_id"] = buy_item_id
        return offer
}))

问题是它没有按正确的顺序运行。输出的顺序是

  1. 调试线 1
  2. 调试线 1
  3. 调试第 2 行
  4. 调试第 2 行

正确的顺序应该是这样的:

  1. 调试线 1
  2. 调试第 2 行
  3. 调试线 1
  4. 调试第 2 行

【问题讨论】:

    标签: sql node.js postgresql async-await


    【解决方案1】:

    使用map() 遍历您的数组,对每个项目执行您提供的函数并将结果存储在数组中。当您传递一个异步函数时,map()并行在每个项目上运行该函数并返回一个待处理的承诺数组,然后将其包装在 Promise.all 调用中以等待它们完成。

    如果您希望按顺序遍历数组,则可以使用简单的 for...of 循环:

    for (let offer of offers) {
        offer["free_item_id"] = await db("offer_free_items").where({"offer_free_items.offer_id":offer.id}).select(["item_id"]).first()
        console.log("-----------------debug line 1------------------")
    
        offer["buy_item_id"] = await db("offer_buy_items").where({"offer_buy_items.offer_id":offer.id}).select(["item_id"]).first()
        console.log("-----------------debug line 2-------------------")
    }
    

    【讨论】:

    • 你是完美的。节省了我的时间。
    猜你喜欢
    • 2016-12-18
    • 2014-12-09
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多