我已经看过很多很多关于此主题的帖子和大量的网络文章,但我仍然难以解决我的问题。我发现this post非常有用,但我的timeoutRequest()函数永远不会被调用。
我正在使用$ http的timeout属性的承诺,但底层的HTTP请求未被取消。我认为承诺本身正在得到解决,但请求并未取消。
我的控制器的行为看起来是这样的:
$scope.enquiriesSelected = function() {
$scope.cancelHttpRequests();
$location.path("/enquiries");
};
$scope.cancelHttpRequests = function() {
console.log(canceller.promise.$$state);
canceller.resolve("User cancelled");
console.log(canceller.promise.$$state);
};
我的HTTP请求,承诺如下:
var canceller = $q.defer();
$scope.searchResultsPromise = $http({
url: "/api/customers/customersearch",
method: "POST",
data: criteria,
timeout: canceller.promise
})
.success(function(data) {
$scope.customerSearchResults = data;
});
我已经尝试了各种方法来得到这个工作,包括把消除在$范围。
我一直在寻找通过AngularJS源代码,我发现这些行:
if (timeout > 0) {
var timeoutId = $browserDefer(timeoutRequest, timeout);
} else if (isPromiseLike(timeout)) {
timeout.then(timeoutRequest);
}
function timeoutRequest() {
jsonpDone && jsonpDone();
xhr && xhr.abort();
}
然而,当我的承诺,解决执行路径没有达到这些行。 xhr.abort()永远不会被调用,这是AngularJS源代码中放弃HTTP请求的唯一地方。
尝试取消请求时,使用F12(Chrome)中的控制台进行检查显示承诺的$$状态从0更改为1,因此我相当确信承诺正在解决。但是,在网络流量中,HTTP请求未被取消。在HTTP请求完成之前,我无法导航到其他页面。
任何人都可以帮忙吗?
中号
+0
如果您的请求花费很长时间,我可能会在服务器端创建一个布尔值,表示数据已加载/准备就绪,并且如果布尔值为true,则可以检查每一秒,然后获取数据。这里有两个优点:用户可以取消定时器,并避免检查数据准备好,浏览器不会挂起。 –
+0
我不能那样做,我害怕。我打电话给我没有源代码的服务。 –
+0
为什么您将承诺保存到$ scope.searchResultsPromise?如果你删除它,这有帮助吗? –