我正在使用Express on backend,Postgres for db和Sequelize for ORM构建应用程序。
我有3个相关模型:
Post
Event
Publishing
,属于Post
,属于Event
当我发布Post
时,我将其状态更新为2,我需要创建Event
和Publishing
。 Publishing
将包含postId
和eventId
,以及我通过查询传递的其他内容。我尝试了下面的代码,它改变了Post的状态,创建了一个Event和Publishing,但它们彼此没有关系。
publishPost(req) {
return new Promise((resolve, reject) => {
async.parallel({
changeState: (callback) => {
Post.findAll({
where: { id: req.query.post_id },
attributes: ['id', 'state']
})
.then((updateState) => {
updateState.forEach((postState) => {
postState.updateAttributes({ state: 2 });
});
})
.then((updatedState) => {
callback(null, updatedState);
});
},
createEvent: (callback) => {
Event.create({
instructions: req.query.instructions,
})
.then((createdEvent) => {
callback(null, createdEvent);
});
},
createPublishing: (callback) => {
Publishing.create({
start_date: req.query.startDate,
end_date: req.query.endDate,
})
.then((createdPublishing) => {
callback(null, createdPublishing);
});
}
}, (error, result) => {
resolve(result);
});
});
}
如何将两条记录的ID传递给第三个模型?
答案 0 :(得分:0)
您的实施有几个问题! 首先,您的承诺永远不会拒绝。
尽管如此,您实际上并不需要为此创建承诺或使用异步,也不希望它们并行运行:如果创建Publishing
记录需要有关{{1}的信息},那么你想首先创建事件,以便你有Event
,然后在输入中传递它。
另一件重要的事情,请看一下这段代码:
id
在第一个内部,你正在进行多次更新,这是承诺。他们将被派遣,你永远不会得到他们的价值。让我解释一下:
想想你是否只有一个更新。它会是这样的:
.then((updateState) => {
updateState.forEach((postState) => {
postState.updateAttributes({ state: 2 });
});
})
.then((updatedState) => {
callback(null, updatedState);
});
请参阅,我们将返回一个承诺(在本例中为更新),因此只有在更新结算时才会调用下一个 .then((updateStates) => {
return updateStates[0].updateAttributes({ state: 2 });
})
。
如果我们这样做:
then
它将调度更新(这需要时间),但因为你没有返回它,它将通过并返回任何内容。看看这个:
.then((updateStates) => {
updateStates[0].updateAttributes({ state: 2 });
})
因此,您正在调用多个更新而不返回其值;如果他们失败了,你永远不会知道。
还有一件事:如果在此过程中出现问题,您可能想要回滚到目前为止所做的所有更改,为此,您应该使用事务。
也许你应该尝试这样的事情(未经测试):
var promise1 = new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('foo')
}, 2);
});
var promise2 = new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('foo2')
}, 2);
});
promise1
.then(function(result){
promise2
})
.then(function(result){
console.log(result) //will print undefined
})
promise1
.then(function(result){
return promise2
})
.then(function(result){
console.log(result) //will print foo2
})