मैंने इस विषय पर बहुत सारे पोस्ट और बहुत से वेब लेख देखे हैं, और बहुत सारे वेब लेख हैं, लेकिन मैं अपनी समस्या से चिपक गया हूं। मुझे this post बहुत उपयोगी मिला लेकिन मेरा टाइमआउटRequest() फ़ंक्शन कभी नहीं कहा जा रहा है।
मैं $ http की टाइमआउट संपत्ति के साथ एक वादा का उपयोग कर रहा हूं लेकिन अंतर्निहित 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 अनुरोध को रोकता है।
अनुरोध रद्द करने का प्रयास करते समय एफ 12 (क्रोम) में कंसोल के साथ निरीक्षण से पता चलता है कि वादा का $$ राज्य 0 से 1 में बदल जाता है, इसलिए मुझे उम्मीद है कि वादा हल हो रहा है। हालांकि नेटवर्क यातायात में HTTP अनुरोध रद्द नहीं किया जा रहा है। HTTP अनुरोध पूरा होने तक मैं किसी अन्य पृष्ठ पर नेविगेट नहीं कर सकता।
क्या कोई मदद कर सकता है?
एम
यदि आपका अनुरोध लंबे समय से ले रहा है, तो शायद मैं सर्वर पर एक बूलियन बनाउंगा, कह रहा हूं कि डेटा लोड/तैयार है, और यदि आप बूलियन सत्य हैं तो आप हर सेकेंड की जांच कर सकते हैं, डेटा वापस प्राप्त करें। यहां दो फायदे हैं: उपयोगकर्ता टाइमर को रद्द कर सकता है और डेटा तैयार करने से बच सकता है, ब्राउज़र लटका नहीं है। –
मैं ऐसा नहीं कर सकता कि मुझे डर है। मैं एक सेवा बुला रहा हूं जिसके लिए मेरे पास स्रोत कोड नहीं है। – serlingpa
आप $ scope.searchResults समझौते का वादा क्यों बचाते हैं? यदि आप इसे हटा देते हैं, तो क्या इससे मदद मिलती है? – Vlad274