在NodeJS中链接承诺

时间:2018-04-14 12:46:38

标签: javascript node.js promise

我的问题是关于承诺。如何使用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的结果,我该如何解决?

我可以修改承诺或创建新的承诺。我无法改变的唯一两个事实是我需要数据库事务和删除顺序,第一个文档和最后一个任务

2 个答案:

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

所有任务都将以瀑布方式执行,如果任何任务失败,您可以从那里退出,它将完成阻止,您可以向用户发送相应的响应。