postgresql 事务助手的“for await”循环查询数组

Array of queries for `for await` loop for postgresql transaction helper

我制作了一个交易功能,可以像这样为我简化此操作(有效):

export async function transaction(queriesRaw) {
  let allResults = []

  const client = await pool.connect()

  try {
    await client.query('BEGIN')
    var queries = queriesRaw.map(q => {
      return client.query(q[0], q[1])
    })

    for await (const oneResult of queries) {
      allResults.push(oneResult)
    }
    await client.query('COMMIT')
  } catch (err) {
    await client.query('ROLLBACK')
  } finally {
    client.release()
    return allResults
  }
}

并像这样进行交易:

let results = await transaction([
            ['UPDATE readers SET cookies=5 WHERE id=;', [1]],
            ['INSERT INTO rewards (id) VALUES ();', [3]]
          ])

事务应该在数组索引序列中一次执行一个查询(因此回滚到以前的值将正常工作)和 return 以相同的顺序(有时我需要来自某些查询的 return 值)

据我所知,它已经在 map 地图函数中启动了。在等待中,我只是等待它的结果,第二个查询可能比以前更快地完成。

那么我该如何解决这个问题?

P.S。也许像 new Promise() 这样的东西而不是 map 是正确的方法?

如果我没听错,只需使用具有适当 await 的 for 循环,而不是回调式循环。

所以你可以等待函数到 return 直到一切都按时间顺序执行,经过一些思考,你可以轻松添加一个 revoke() 函数或其他东西..


...
export async function transaction(queriesRaw) {
  let allResults = []

  const client = await pool.connect()

  try {
    await client.query('BEGIN')

    for(var i = 0; i < queriesRaw.length;i++) {
        var res = await client.query(queriesRaw[i][0], queriesRaw[i][1])
        allResults.push(res)
    }

    await client.query('COMMIT')
  } catch (err) {
    await client.query('ROLLBACK') 

    // do you maybe wanna errors to results to?
    // allResults.push(err)
  } finally {
    client.release()
    return allResults
  }
}

信息,

例如查看 async 模块或类似的东西。这样你就不用考虑这些了。

改变这个:

var queries = queriesRaw.map(q => {
  return client.query(q[0], q[1])
})

for await (const oneResult of queries) {
  allResults.push(oneResult)
}

收件人:

for(const q of rawQueries) {
   let result = await client.query(q[0], q[1]);
   allResults.push(result);
});