我是角色新手,想用它将数据发送到我应用的后端。在几个场合,我必须做几个http post调用,要么全部成功,要么全部失败。这种情况让我头疼:给两个http post调用,如果一个调用成功,但另一个调用失败怎么办?这将导致数据库中的不一致。我想知道如果至少有一个呼叫失败,是否有办法取消后续呼叫。谢谢!
答案 0 :(得分:0)
在不了解您的具体情况的情况下,如果您还没有这样做,我会建议您使用promise错误处理。只有一种情况我知道你可以通过使用$ http中的超时选项取消已发送的承诺(查看this SO帖子),但你绝对可以防止将来的请求。进行$ http调用时会发生什么,它会返回一个promise对象(查看$ q here)。这样做会返回两个方法,你可以链接到你的$ http请求,称为成功和失败,所以它看起来像$ http.success({... stuff ...})。error({...更多的东西。 })。因此,如果您在每个场景中都有错误处理,并且得到.error,请不要进行下一次调用。
答案 1 :(得分:0)
您可以取消链中的下一个请求,但之前的请求已经发送。您需要提供必要的后端功能来反转它们。
如果每个步骤都依赖于另一个步骤并导致数据库发生更改,那么在后端执行整个过程可能会更好,由单个“POST”请求触发。我认为同步建模这个过程更容易,这在服务器中比在客户端更容易。
但是,如果您必须在客户端执行发布请求,则可以将每个请求步骤定义为单独的函数,并通过then(successCallback, errorCallback)
链接它们(此处为Nice视频示例:https://egghead.io/lessons/angularjs-chained-promises)。
在您的情况下,您可以在每个步骤中使用then
的错误回调检查前一个步骤是否未通过采取操作来撤消它:
var firstStep = function(initialData){
return $http.post('/some/url', data).then(function(dataFromServer){
// Do something with the data
return {
dataNeededByNextStep: processedData,
dataNeededToReverseThisStep: moreData
}
});
};
var secondStep = function(dataFromPreviousStep){
return $http.post('/some/other/url', data).then(function(dataFromServer){
// Do something with the data
return {
dataNeededByNextStep: processedData,
dataNeededToReverseThisStep: moreData
}
}, function(){
// On error
reversePreviousStep(dataFromPreviousStep.dataNeededToReverseThisStep);
});
};
var thirdFunction = function(){ ... };
...
firstFunction(initialData).then(secondFunction)
.then(thirdFunction)
...
如果链中的任何步骤失败,它的承诺将失败,并且不会执行后续步骤。