当取消这样的http请求时:

$scope.runTest = function() {
    if (canceler) canceler.resolve();
    canceler = $q.defer();
    $http({
        method: 'GET',
        url: 'http://www.google.com/',
        timeout: canceler.promise
    })
    .success(function(data) {
        $scope.result.push({msg: "this won't be displayed on cancel"});
    })
    .error(function(data) {
        $scope.result.push({msg: "this will be displayed on cancel"});
    });
};

是否可以使已取消的HTTP请求具有特定的HTTP代码,例如205? 它导致http拦截器以http状态0触发,该状态也用于超时或没有网络连接。 我希望能够区分拦截器中的两种情况

谢谢!

#1楼 票数:7 已采纳

我最终采用以下方法:

$scope.runTest = function() {

    if (canceler) {
        // Set non-zero status for http interceptors
        // Using 499, an nginx extension to flag cancelled http requests
        // Could be something else like a boolean, using status code for convenience
        canceler.promise.status = 499;

        // Cancel the request
        canceler.resolve();
    }

    canceler = $q.defer();
    $http({
        method: 'GET',
        url: 'http://www.google.com/',
        timeout: canceler.promise
    })
    .success(function(data) {
        // On sucesss
    })
    .error(function(data) {
        // On error
    });
};

在这里,我只是在超时上设置了一些内容,以将请求标记为已取消,如@Daniel Silva建议的那样。 然后在我的HTTP拦截器上:

app.config(function($httpProvider) {

    $httpProvider.interceptors.push(function($q) {
        return {
            'responseError': function(response) {

                var statusCode = response.status;

                // Get status from timeout, if 0 and timeout present
                if (statusCode === 0 && response.config.timeout) {
                    statusCode = response.config.timeout.status;
                }

                // Ignore client request cancelled
                if (statusCode === 499) {
                    return response;
                }

                // Reject via $q, otherwise the error will pass as success
                return $q.reject(response);
            }
        };
    });
});

#2楼 票数:1

您需要记住,Angular $ http超时是“客户端”超时,尽管它具有与服务器超时相同的名称。 当配置角度$ http超时时,您会说类似“我不会等到服务器超时”。 当您访问第三方api时,此功能特别有用,因为您无法配置超时设置。

这就是http状态0的原因。因为Angular取消了请求而不是等待服务器超时,所以没有http 408响应。

您可以使用$ timeout服务返回的承诺来处理客户端超时

var myTimeout = $timeout(function () {
    console.log("Cannot wait you anymore!");
}, 1000); 

$http({
    method: 'GET',
    url: 'http://www.google.com/',
    timeout: myTimeout
})
.success(function (data) {
    $scope.result.push({ msg: "this won't be displayed on cancel" });
})
.error(function (data) {
    $scope.result.push({ msg: "this will be displayed on cancel" });
});

  ask by inolasco translate from so

未解决问题?本站智能推荐:

4回复

如何使用Angular.js发出HTTP请求?

我正在尝试使用Angular.js向Last.fm API发出HTTP请求,但无法正常工作。 我已经分离出我的Angular js文件,并使用Codekit将它们编译成一个单独的js文件,称为scripts.js。 文件的编译顺序为: angular.min.js app.
1回复

AngularJS-HTTP请求已取消-报告404

我在用角度提出HTTP请求时遇到问题。 该请求需要很长时间,因为它等待复杂的数据库查询。 如果在此期间用户单击指向其他页面的链接(我们有几个不同的单页面应用程序),则请求被取消(可以),但报告的状态为404。现在,所讨论的请求不应在正常的业务过程中会失败,因此当它出现时,我们会将其记录到
3回复

取消HTTP请求并解决angular中的错误功能

嗨,我想在2秒后取消我的http请求。 如果未接收到数据,则应解析为错误函数并返回一个空对象。 我知道我必须以某种方式使用timeout属性。 我在哪里确切使用$ timeout? 我不确定我是否理解正确。
2回复

Angular.JS多个$ http发布:如果失败则取消

我是angular的新手,想使用它将数据发送到我的应用程序的后端。 在某些情况下,我必须进行几次http调用,这些调用要么全部成功要么全部失败。 这是使我头疼的情况:给定两个http post调用,如果一个调用成功,而另一个调用失败怎么办? 这将导致数据库不一致。 我想知道如果至少一个呼
1回复

取消$ http请求angularjs

尝试在搜索输入框上取消$ http请求,但先前的请求似乎没有中止。 我跟着其他堆栈溢出问题的例子。 这是我的JS代码: HTML: 如果我在搜索框中输入两个字符,则会调用该函数两次,但初始请求仍然会通过。 因此,两个请求最终都会通过,并且在响应时间内等待它是随机的,正在使用
1回复

angular.js $ http.error没有状态返回json

我是Angular.js的新手,并且正在关注Angular网站的教程。 我正在尝试使用$ http服务从json文件中获取数据, 但是什么也没发生! 甚至错误状态也不起作用... 这是我的代码: 和js部分: 解决方案 : 谢谢sylwester,我发现了问题
1回复

从Angular.js $ http请求中删除标头

我想从一个特定的请求中删除一些$http请求头字段(这意味着不在$httpProvider级别)。 这些字段是: 缓存控制 如果-Modified-Since的 引荐 X-要求,随着 如何在一个请求中执行此操作? 我试图使用transformRequ
1回复

为什么即使添加了CORS,在http请求中仍然保持状态代码403?

当我尝试在应用程序的前端使用Angular发出http请求时,由于在预检请求中收到状态代码403,所以无法完成请求。 我已经在后端的Node.js中设置了标头,以允许访问,但是对于GET或POST请求,仍然出现错误。 我在这里还读了一些答案,他们基本上说是将标头Access-Control-