我的问题是关于承诺。如何使用asn结构执行以下操作。
我尝试删除任务。任务有文件。
对于删除任务,首先我从数据库中获取任务,然后获取并删除任务文档,最后删除任务。
所有这些都在我的数据库库的事务中。如果某些内容无法回滚事务。
我最初的想法是这段代码:
connection.beginTransaction(function (err) {
getTaskById(1)
.then(getTaskDocuments)
.then(deleteTaskDocuments)
.then(deleteTask)
.then(function(){
connection.commit(function (err) {
if (err) {
throw new Error()
}
res.json();
});
}).catch(
return connection.rollback(function() {
res.status(500).json()
})
});
它将永远不会起作用,因为deleteTask,需要getTaskById的结果,我该如何解决?
我可以修改承诺或创建新的承诺。我无法改变的唯一两个事实是我需要数据库事务和删除顺序,第一个文档和最后一个任务
答案 0 :(得分:0)
我建议:
getTaskById(1).then(function (task) {
return getTaskDocuments(task)
.then(deleteTaskDocuments)
.then(function () { return task })
.then(deleteTask) })
答案 1 :(得分:-1)
执行此操作的最佳方法是在Node JS中使用asnyc库。要实现此功能,您可以使用async.waterfall方法执行上述事务,您可以执行以下操作。我假设您有2个不同的集合称为任务和任务文档,首先您获取任务ID并使用该ID您正在检查taskdocuments集合,如果文档ID是,那么您将删除它
var executeTransaction = function (req, res) {
async.waterfall([
getTaskId(req),
getTaskDocuments,
deleteTaskDocuments,
deleteTask
], function done(error, success) {
if (error) { alert('Something is wrong!'); }
return alert('Done!');
});
};
function getTaskId (req) {
return function (callback) {
var id = req.body;
callback (null, id);
}
}
function getTaskDocuments (id, callback) {
return function (callback) {
var document = function () { // do something here };
callback (err, document);
}
}
function deleteTaskDocuments (document, callback) {
return function (callback) {
var somethingmore = function () { // do something here };
callback (err, task);
}
}
function delete (document, callback) {
return function (callback) {
var somethingmore = function () { // do something here };
callback (err, somethingmore);
}
}
所有任务都将以瀑布方式执行,如果任何任务失败,您可以从那里退出,它将完成阻止,您可以向用户发送相应的响应。