无法解决承诺链

时间:2018-04-25 08:22:59

标签: javascript promise sequelize.js es6-promise ecmascript-5

我正在尝试编写一个Sequelize迁移脚本win,我正在尝试更新我的数据库,但它有许多异步操作(数据库查询,然后使用特定ID更新数据库)

这是我的代码

return db.organizationEntries
      .findAll()
      .then((entries) => {
        return entries.forEach(entry => {
          console.log(entry);
          db.organizationEntries
            .findAll({
              attributes: [
                [
                  db.sequelize.fn(
                    'MAX',
                    db.sequelize.col('organizationEntries.serial_number')
                  ),
                  'maximum_serial_no'
                ]
              ],
              where: {
                organizationId: entry.organizationId
              }
            })
            .then(orgEntry => {
              console.log(orgEntry[0].dataValues.maximum_serial_no);
              let data = { serialNumber: orgEntry[0].dataValues.maximum_serial_no + 1 };
              console.log(data)

              //problem 
              db.organizationEntries.update(data, {
                where: {
                  id: entry.id
                }
              })
                .then((result) => {
                  console.log(result);

                })
            });
          // promises.push(promise);
        });
        // return Promise.all(promises);
      }) 

实际上我要做的是尝试从数据库中获取所有orgEntries的列表,然后我找到organization_id的最大序列号,然后更新该特定的orgEntry和像这样在循环中的所有这些操作

现在问题是所有事情都按顺序进行但是在找到max_serial_no之后它没有更新数据库,我无法解决我应该做什么来使异步调用按此顺序工作< / p>

1 个答案:

答案 0 :(得分:2)

我认为你可以通过两种方式解决这个问题:

同时承诺

在以下代码中,我删除了forEach,转而使用>>> print(*all_paths(graph, 'B', 'B', 5), sep='\n') ['B', 'A', 'B', 'A', 'B', 'B'] ['B', 'A', 'B', 'C', 'B', 'B'] ['B', 'A', 'B', 'B', 'A', 'B'] ['B', 'A', 'B', 'B', 'C', 'B'] ['B', 'A', 'B', 'B', 'B', 'B'] ['B', 'C', 'B', 'A', 'B', 'B'] ['B', 'C', 'B', 'C', 'B', 'B'] ['B', 'C', 'B', 'B', 'A', 'B'] ['B', 'C', 'B', 'B', 'C', 'B'] ['B', 'C', 'B', 'B', 'B', 'B'] ['B', 'B', 'A', 'B', 'A', 'B'] ['B', 'B', 'A', 'B', 'C', 'B'] ['B', 'B', 'A', 'B', 'B', 'B'] ['B', 'B', 'C', 'B', 'A', 'B'] ['B', 'B', 'C', 'B', 'C', 'B'] ['B', 'B', 'C', 'B', 'B', 'B'] ['B', 'B', 'B', 'A', 'B', 'B'] ['B', 'B', 'B', 'C', 'B', 'B'] ['B', 'B', 'B', 'B', 'A', 'B'] ['B', 'B', 'B', 'B', 'C', 'B'] ['B', 'B', 'B', 'B', 'B', 'B'] Promise.all()

  • map()方法创建(并返回)一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

示例:

map()
  • let numbers = [1, 2, 3] let doubledNumbers = numbers.map(n => n * 2) // doubledNumbers [2, 4, 6] 方法将一个Promises数组作为参数,并返回一个Promise,当所有promise都被解析或拒绝时,如果一个promise失败,将会解析它。

示例:

Promise.all()

结果:

let promise1 = findUserById(5)
let promise2 = findUserFriends(5)
Promise.all([promise1, promise2])
.then(values => {
  // values: [user object, list of user friends]
})

使用db.organizationEntries.findAll() .then(entries => { return Promise.all(entries.map(entry => { console.log(entry) return db.organizationEntries.findAll({ where: { organizationId: entry.organizationId }, attributes: [ [ db.sequelize.fn('MAX', db.sequelize.col('organizationEntries.serial_number')), 'maximum_serial_no' ] ] }) .then(orgEntry => { console.log(orgEntry[0].dataValues.maximum_serial_no) let data = { serialNumber: orgEntry[0].dataValues.maximum_serial_no + 1 } console.log(data) return db.organizationEntries.update(data, { where: { id: entry.id } }) }) })) }) .then(result => { // result: Array of updated organizationEntries console.log(result) }) 方法

逐步接受承诺
  • reduce()方法对累加器和数组中的每个元素(从左到右)应用函数以将其减少为单个值。 (来自MDN网络文档)

示例:

reduce()

结果:

let items = [{ name: 'pencil', price: 2 }, { name: 'book', price: 10 }]
let total = items.reduce((total, item) => total += item.price, 0)
// total: 12