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);
});
我制作了一个交易功能,可以像这样为我简化此操作(有效):
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);
});