如何将交易系统构建到.then()链中?

时间:2018-06-03 18:56:47

标签: node.js promise request request-promise

我的代码中有多个链式同步请求。我正在使用NodeJS包请求 - 承诺。

这是一些伪代码,用于显示其格式:

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更改的数据?

感谢。

2 个答案:

答案 0 :(得分:1)

  

链是否继续,或者是否完全脱离了循环?

它会中断并进入catchfinally proposal,这在最近的Node.js版本中可用,并且可以在旧版本中进行多种填充 - 类似于try..catch..finally对同步代码的工作方式(这是如何将简单的承诺转换为async函数。

  

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

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

答案 1 :(得分:1)

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