1

我的代码中有多个链接的同步请求。我正在使用 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 更改的数据?

谢谢。

4

2 回答 2

1

链条会继续,还是完全脱离循环?

它中断并继续到catchor finallyproposal,它在最近的 Node.js 版本中可用,并且在旧版本中可以填充 - 类似于try..catch..finally同步代码的工作方式(这也是将简单的 Promise 转换为async函数的方式)。

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

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

于 2018-06-03T19:37:23.840 回答
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)
});
于 2018-06-03T20:05:54.260 回答