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);
})