使用Promise.map的每个Promise值作为下一个循环的输入

时间:2018-11-30 08:24:18

标签: javascript node.js es6-promise bluebird knex.js

我已经完成了一整天的研究,以了解如何在 }) }); 中获得每个诺言的结果,并将其用作下一个迭代过程中的输入Promise.map。我严格需要执行此方法,因为在必须为ATOMIC 数据库操作中使用了此逻辑,并且在任何承诺被拒绝的情况下,以前的交易必须回滚。

注意::我使用过Promise.map,但效果很好,因为它不允许我将单个的承诺关联起来,如果一个承诺失败,则回滚全部 。因此,promise.each似乎是最好的解决方案,当每个承诺都得到认真解决并返回值而不会在下一循环中引起Promise.map时。这是knex的逻辑:

Error: Transaction query already complete

2 个答案:

答案 0 :(得分:0)

您可以检出async.jshttps://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.eachknex配合得很好,在循环过程中我在某个人commit的{​​{1}}内部调用then时犯了一个错误,因此在下一个循环的下一次事务尝试中导致promises原因:无需在knex事务上下文/块中调用Error: Transaction query already complete,因为它是在该上下文中自动触发的。

要注意以下答案:

commitKnex一起使用要求您在每个承诺的Promise.each块内并使用then听取可能的拒绝,在某些情况下明确拒绝< / strong>,否则后续的Promise /值将继续循环,并且无法使数据库成为原子原子!!

try/catch