我已经完成了一整天的研究,以了解如何在 })
});
中获得每个诺言的结果,并将其用作下一个迭代过程中的输入Promise.map
。我严格需要执行此方法,因为在必须为ATOMIC 的数据库操作中使用了此逻辑,并且在任何承诺被拒绝的情况下,以前的交易必须回滚。
注意::我使用过Promise.map
,但效果很好,因为它不允许我将单个的承诺关联起来,如果一个承诺失败,则回滚全部 。因此,promise.each
似乎是最好的解决方案,当每个承诺都得到认真解决并返回值而不会在下一循环中引起Promise.map
时。这是knex的逻辑:
Error: Transaction query already complete
答案 0 :(得分:0)
您可以检出async.js
库https://caolan.github.io/async/docs.html
这就是你可以做的
knex.transaction(function(trx) {
return async.mapValuesSeries(array, (item) => {
return trx.insert(item).into('table')
.then(returnedFields => {
//do some validation/operation and return the result or the returnedFields themselves as input in the next loop.
});
}, (error, inserts) => {
if (err) {
console.error(error);
}
console.log(inserts.length + 'Items saved.');
});
});
答案 1 :(得分:-1)
感谢所有发表过深刻/深刻见解的人。但是事实证明,Promise.each
与knex
配合得很好,在循环过程中我在某个人commit
的{{1}}内部调用then
时犯了一个错误,因此在下一个循环的下一次事务尝试中导致promises
。 原因:无需在knex事务上下文/块中调用Error: Transaction query already complete
,因为它是在该上下文中自动触发的。
要注意以下答案:
将commit
与Knex
一起使用要求您在每个承诺的Promise.each
块内并使用then
听取可能的拒绝,在某些情况下明确拒绝< / strong>,否则后续的Promise /值将继续循环,并且无法使数据库成为原子原子!!
try/catch