我已經看過很多很多關於此主題的帖子和大量的網絡文章,但我仍然難以解決我的問題。我發現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請求完成之前,我無法導航到其他頁面。
任何人都可以幫忙嗎?
中號
如果您的請求花費很長時間,我可能會在服務器端創建一個布爾值,表示數據已加載/準備就緒,並且如果布爾值爲true,則可以檢查每一秒,然後獲取數據。這裏有兩個優點:用戶可以取消定時器,並避免檢查數據準備好,瀏覽器不會掛起。 –
我不能那樣做,我害怕。我打電話給我沒有源代碼的服務。 – serlingpa
爲什麼您將承諾保存到$ scope.searchResultsPromise?如果你刪除它,這有幫助嗎? – Vlad274