如何在 AngularJS $http 中处理较长的响应时间?



我有一个从API获取一些数据的方法。

$http.get("https://httpstat.us/200?sleep=20000", header).then(
function successCallback(response) {
//logic
},
function errorCallback(response) {

}
);

在某些测试用例中,API 需要很长时间才能响应,所以我需要一种方法来处理这种情况。如果 API 花费的时间超过 10 秒,我需要返回一些数据。我尝试使用以下代码为请求添加超时

$http.get("https://httpstat.us/200?sleep=20000", {timeout: 10000}).then(

但这只会中止请求并转到错误回调。有没有另一种方法可以知道请求是否永远需要很长时间才能响应而不会实际使请求超时?

简短的anwser,没有内置的方式来通知 http 服务侦听器请求很长。

但是,您可以构建一个延迟包装器,将 http 调用封装在延迟中,以便如果服务响应时间过长,您将能够通知侦听器,但您必须自己计时。

看看这篇文章,作者解决了与您的类似问题

https://www.peterbe.com/plog/angularjs-$q-notify-resolve-local-get-proxy

如果你只需要在一段时间后运行一个函数,你可以使用$timeout. 将要运行的函数传递给$timeout,时间以毫秒为单位,它将返回一个计时器承诺。如果您的$http调用在超时之前解析,只需运行$timeout.cancel([promise])并传递您的计时器承诺。这将取消内部超时函数调用。

var timer = $timeout(function() {
console.log("this request is taking too long...")
// tell the client it will take a while ...
}, 10 * 1000);
$http({method: $scope.method, url: $scope.url, cache: $templateCache}).
then(function(response) {
// handle successful response ...
$timeout.cancel(timer); // about your timeout function call
}, function(response) {
// handle rejection ...
});

当然,您可以在 finally 子句中取消超时。 (普伦克(

如果您不想为每个包装$http的函数编写相同的代码,请考虑使用拦截器。

最新更新