我的代码中有多个链式同步请求。我正在使用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更改的数据?
感谢。
答案 0 :(得分:1)
链是否继续,或者是否完全脱离了循环?
它会中断并进入catch
或finally
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)
});