【发布时间】:2014-01-23 22:00:34
【问题描述】:
我是 Angular 的新手,想用它来将数据发送到我的应用程序的后端。在某些情况下,我必须进行几次 http post 调用,这些调用要么全部成功,要么全部失败。这是让我头疼的场景:给定两个 http post 调用,如果一个调用成功,而另一个调用失败怎么办?这将导致数据库中的不一致。如果至少一个呼叫失败,我想知道是否有办法取消后续呼叫。谢谢!
【问题讨论】:
我是 Angular 的新手,想用它来将数据发送到我的应用程序的后端。在某些情况下,我必须进行几次 http post 调用,这些调用要么全部成功,要么全部失败。这是让我头疼的场景:给定两个 http post 调用,如果一个调用成功,而另一个调用失败怎么办?这将导致数据库中的不一致。如果至少一个呼叫失败,我想知道是否有办法取消后续呼叫。谢谢!
【问题讨论】:
在不了解您的具体情况的情况下,如果您还没有这样做,我会敦促您使用 Promise 错误处理。我知道只有一种情况可以取消已发送的承诺,即使用 $http 中的超时选项(查看this SO 帖子),但您绝对可以阻止未来的请求。当你调用 $http 时会发生什么,它会返回一个 promise 对象(查看 $q here)。它的作用是返回两个方法,您可以将它们链接在您的 $http 请求上,称为成功和失败,因此它看起来像 $http.success({...stuff...}).error({...more stuff. .})。因此,如果您在上述每种情况下都进行了错误处理并且收到 .error,请不要进行下一次调用。
【讨论】:
您可以取消链中的下一个请求,但之前的请求已经发送。您需要提供必要的后端功能来反转它们。
如果每个步骤都依赖于另一个步骤并导致数据库发生变化,那么最好在后端完成整个过程,由单个“POST”请求触发。我认为同步建模这个过程更容易,而且在服务器上比在客户端更容易。
但是,如果您必须在客户端执行 post 请求,您可以将每个请求步骤定义为一个单独的函数,并通过 then(successCallback, errorCallback) 链接它们(此处的视频示例: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)
...
如果链中的任何步骤失败,则承诺将失败,并且不会执行后续步骤。
【讨论】: