我的页面上有一个刷新按钮,单击该按钮会调用服务器以获取数据。如果多次点击,我想取消/忽略之前的呼叫(客户端仍在等待)并且只使用最新的响应数据。
我的服务是:
// based on http://odetocode.com/blogs/scott/archive/2014/04/24/canceling-http-requests-in-angularjs.aspx
services.factory('mySrvc', ['LoginService', '$http', '$q', function (LoginService, $http, $q) {
var baseUrl = '...';
return {
GetThing: function (id) {
var canceller = $q.defer();
var cancel = function (reason) {
canceller.resolve(reason);
};
var promise = $http({
method: 'GET',
url: baseUrl + 'things/getbyid/' + id,
headers: LoginService.authHeader(),
timeout: canceller.promise
}).then(function (response) {
return response.data;
});
return {
promise: promise,
cancel: cancel
};
}
}
});
在我的控制器中:
var requestInProgress = null;
var getThing = function (id) {
if (requestInProgress !== null) {
requestInProgress.cancel('cancel last request');
}
var request = mySrvc.GetThing(id);
requestInProgress = request;
request.promise.then(
function (data) { // success
// do some stuff with the data
requestInProgress = null;
}, function (reason) { // error
console.log(reason);
// need to differentiate here between a cancelled request and a genuine error...
});
};
这确实取消了最后一个请求,但是返回的“原因”是一个对象,包含配置,数据,标题,状态等。我找不到消息“取消上一个请求”。我不关心消息本身,我只需要一种方法来区分已取消的请求和真正失败的请求。我该怎么做?
由于
答案 0 :(得分:3)
根据我的经验,取消通常会返回状态为0(而不是像404,500等),所以我可以在此基础上忽略它们。或许其他人有一个比这更好的规则忽略它们,如果是这样我自己会采用它。