首页 > 解决方案 > 使用 Promise.map 的每个承诺值作为下一个循环的输入

问题描述

我已经完成了一整天的研究,研究如何在 a 中获取每个 promise 的结果,Promise.map并将其用作相同循环期间的下一次迭代中的输入Promise.map。我严格需要执行此方法,因为在必须是 ATOMIC的数据库操作中使用此逻辑,并且在任何承诺拒绝的情况下,必须回滚所有先前的事务。

注意:我已经使用promise.each并且它运作良好,只是它不允许我关联各个承诺并在失败时全部回滚。因此,当仔细解决每个承诺并返回值而不会在下一个循环中Promise.map引起时,这似乎是最好的解决方案。Error: Transaction query already complete这是knex的逻辑:

var obj={};

knex.transaction(function(trx) {
  return Promise.map(array, function(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.
        //[START EDIT: this responds to comment by @ Mikael Lepistö for clarity]
        //update obj here to be used in next loop
        //[END EDIT]
      });
    }, {concurrency: 1});
})
.then(function(inserts) {
  console.log(inserts.length + 'Items saved.');
})
.catch(function(error) {
  console.error(error);
})

标签: javascriptnode.jses6-promisebluebirdknex.js

解决方案


看一下这个:

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all


推荐阅读