Javascript 书架长交易问题

Javascript 书架长交易问题,javascript,promise,bookshelf.js,Javascript,Promise,Bookshelf.js,当我删除这部分代码时: function saveReport(t) { return new Promise((resolve, reject) => { return new Models .Cycle() .fetchAll() .then((cycles) => { const promises = cycles.map(cycle => { return

当我删除这部分代码时:

  function saveReport(t) {
    return new Promise((resolve, reject) => {
      return new Models
        .Cycle()
        .fetchAll()
        .then((cycles) => {
          const promises = cycles.map(cycle => {
            return ReportService
              .getReportByOrgId(cycle.get('orgId'), cycle.id, undefined, t)
              .then(content => {
                let md5 = crypto.createHash('md5');
                let dayNo = parseInt(Date.now() / (1000 * 60 * 60 * 24), 10);
                var id = md5.update(cycle.id + cycle.get('orgId') + 'requestRealTimeReport' + dayNo).digest('hex');
                return new Models
                  .Report()
                  .save({
                    id: id,
                    statistics: JSON.stringify(content)
                  }, {
                    transacting: t,
                    insert: true
                  })
                  .tap(report => {
                    resolve(report);
                  })
                  .catch(console.error);
              })
              .catch(console.error);
          });
          return Promise.all(promises)
        });
    })
  }

  DbService
    .Bookshelf
    .transaction(saveReport)
    .catch(console.error);

它总是伴随着一个长事务出现,我只是想知道在这个过程中发生了什么。tap()是如何阻止长事务中的事务的。

代码的
tap
部分正在解析您在事务回调顶部声明的
Promise

正如所解释的,您必须在此处理程序中返回一个
Promise
,以便Bookshelf/Knex知道您何时完成了事务中的所有内容。请注意,当您
解析
一个
承诺
时,您实际上是在说承诺中的代码已成功执行。因此,您要删除的代码块是一个重要的代码块:从某种意义上说,它是事务处理程序将控制权传递回书架的方式。移开它会让书架处于一种等待永远不会发生的状态

我还应该注意到,您在任何
catch
块中都没有
reject
调用。这样做的结果将导致出现问题的行为,因为如果指定的事务中存在错误,Bookshelf将永远无法将控制权传递回Bookshelf


在bluebird网站(甚至是MDN文档)上阅读
新承诺
,如果我的解释没有帮助的话,可能会帮助你更好地了解他们在做什么。

你可能还想稍微修改一下格式,这样代码的结尾就不会成为你工作的一部分question@Doug更新了问题。接得好,我甚至没看到那部分。
.tap(report => {
    resolve(report);
})