区分已取消的请求和使用$ http真正错误的请求

时间:2014-07-03 13:26:43

标签: angularjs

我的页面上有一个刷新按钮,单击该按钮会调用服务器以获取数据。如果多次点击,我想取消/忽略之前的呼叫(客户端仍在等待)并且只使用最新的响应数据。

我的服务是:

// 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...
        });
};

这确实取消了最后一个请求,但是返回的“原因”是一个对象,包含配置,数据,标题,状态等。我找不到消息“取消上一个请求”。我不关心消息本身,我只需要一种方法来区分已取消的请求和真正失败的请求。我该怎么做?

由于

1 个答案:

答案 0 :(得分:3)

根据我的经验,取消通常会返回状态为0(而不是像404,500等),所以我可以在此基础上忽略它们。或许其他人有一个比这更好的规则忽略它们,如果是这样我自己会采用它。