【问题标题】:How to build a transaction system into a .then() chain?如何将交易系统构建到 .then() 链中?
【发布时间】:2018-06-04 04:05:54
【问题描述】:

我的代码中有多个链接的同步请求。我正在使用 NodeJS 包 request-promise。

这里有一些伪代码来展示它的格式:

initRequest.then(function(response){
    return request2;
}).then(function(response2){
    return request3;
}).then(function(response3){
    return requestN;
}).catch(function(err){
    log(error)
});

例如,如果 request3 失败,会发生什么?链条会继续,还是完全跳出循环?

如果 request2 是一个 POST,并且 request3 失败了,有没有办法系统地回滚 request2 更改的数据?

谢谢。

【问题讨论】:

  • 你在说什么循环?
  • 回滚应该在接收请求并拥有该数据的服务器上实现,而不是在客户端上。

标签: node.js promise request request-promise


【解决方案1】:

链是继续,还是完全跳出循环?

它中断并继续到 catchfinally proposal,这在最新的 Node.js 版本中可用,并且在旧版本中可填充 - 类似于 try..catch..finally 用于同步代码的方式(这就是将普通的 Promise 转换为的方式async 也可以使用)。

如果 request2 是一个 POST,并且 request3 失败了,有没有办法系统地回滚 request2 更改的数据?

这应该由开发人员保护。如果有可能回滚数据,则应将必要的信息(数据条目 ID)保存到变量并回滚到 catch

【讨论】:

  • 明白了,非常感谢您提供的信息。回滚可能会很困难,因为可能有数百个 POST 对象被发送到 REST API。但是,我认为这并不像我最初想的那样有必要。我在两个服务之间同步信息,所以如果一个服务只有部分更新的数据,其余的将被标记为未更新,并会在下一个同步过程中被拾取。再次感谢!
【解决方案2】:

如果request3 失败,它将停止执行其余的请求链。

并且没有办法系统地回滚 request2 更改的内容,您必须以自定义方式实现它。

request3 失败时处理,自己捕获request3。 这是request3 失败时的简单/迷你处理方式

initRequest.then(function(response){
    return request2;
}).then(function(response2){
    return request3.catch(function(err2){
        //if something goes wrong do rollback
        request2Rollback.then(rollbackRes => {
            throw new Error("request3 failed! roll backed request 2!");
        }).catch(function(err){
            // the rollback itself has failed so do something serious here
            throw err;
        })
    });;
}).then(function(response3){
    return requestN;
}).catch(function(err){
    log(error)
});

【讨论】:

  • 非常感谢您的回答-这很好地分解了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多