如何在javascript循环(map)中运行sql查询?

jgwigjjp  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(645)

我想做的是:
使用map函数遍历对象数组
根据对象运行多个sql查询
用对象追加查询结果
我在循环提供,这是一个对象数组 free_item 以及 buy_item 它们与 offer 。我正在使用knexjs for postgresql数据库和nodejs
以下是实际代码:

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
调试行2
正确的顺序如下:
调试行1
调试行2
调试行1
调试行2

4ktjp1zp

4ktjp1zp1#

使用 map() 遍历数组,对每个项执行提供的函数,并将结果存储在数组中。在传递异步函数时, map() 将对每个项并行运行函数,并返回一个挂起的承诺数组,然后将其 Package 在 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-------------------")
}

相关问题