javascript - 在事务/任务中使用 Promise.all 与在 pg-promise 中使用 t.batch
问题描述
这里的文档清楚地概述了编写是一种不好的做法
Promise.all(data.map(d => db.none('insert into...', d)))
这是查询根数据库协议。因此最好写
db.task(t => t.batch(data.map(d => t.none('insert into...', d))));
但是,如果我不打算使用BatchError
或查询duration
(ref),写这个是错误的吗?
db.task(async t => {
await Promise.all(data.map(d => t.none('insert into...', d)));
});
从外观上看,它仍然使用共享连接协议而不是根连接。
解决方案
ES7async/await
的出现消除了批量查询的需要。
您可以简单地这样做:
await db.task(async t => {
await forEachAsync(data, d => t.none('insert into...', d));
});
或者只返回结果:
await db.task(t => forEachAsync(data, d => t.none('insert into...', d)));
这需要 async for-each 函数,如下所示:
async function forEachAsync(data, cb) {
for (let i = 0; i < data.length; i ++) {
await cb(data[i], i, data);
}
}
但通常,在执行插入数组时您不需要任何这些,因为为此您应该使用多行插入。
推荐阅读
- reactjs - 材料设计引导从右到左方向
- apache-nifi - 如何使用 NIFI CORN 安排特定时间段
- xamarin - XamarinForms 粘性标题
- python - how can i apply convolution to a stereo audio signal?
- database - JHipster 添加 JPA @ManyToMany 会阻止应用程序启动
- c++ - 调用函数是否被视为上下文切换?
- c - openssl HMAC-256 cli 与 c 的区别
- c# - 异步函数不等待 Unity 中的结果
- snowflake-cloud-data-platform - 在 varchar 字段上调用 count distinct 会出错
- excel - VBA - 条件格式公式条件包括 $(无效字符)