समयबाह्य संपत्ति के साथ कोणीय $ http अजाक्स रद्द करना कोणीय 1.3.15 में काम नहीं करता है। उन लोगों के लिए जो इस बात का इंतजार नहीं कर सकते हैं कि मैं एक jQuery Ajax समाधान कोणीय में लिपटे साझा कर रहा हूं।
समाधान में दो सेवाएं शामिल हैं:
- HttpService (jQuery Ajax फ़ंक्शन के आसपास एक आवरण);
- PendingRequestsService (लंबित / खुले अजाक्स अनुरोधों को ट्रैक करता है)
यहाँ PendingRequestsService सेवा जाती है:
(function (angular) {
'use strict';
var app = angular.module('app');
app.service('PendingRequestsService', ["$log", function ($log) {
var $this = this;
var pending = [];
$this.add = function (request) {
pending.push(request);
};
$this.remove = function (request) {
pending = _.filter(pending, function (p) {
return p.url !== request;
});
};
$this.cancelAll = function () {
angular.forEach(pending, function (p) {
p.xhr.abort();
p.deferred.reject();
});
pending.length = 0;
};
}]);})(window.angular);
HttpService सेवा:
(function (angular) {
'use strict';
var app = angular.module('app');
app.service('HttpService', ['$http', '$q', "$log", 'PendingRequestsService', function ($http, $q, $log, pendingRequests) {
this.post = function (url, params) {
var deferred = $q.defer();
var xhr = $.ASI.callMethod({
url: url,
data: params,
error: function() {
$log.log("ajax error");
}
});
pendingRequests.add({
url: url,
xhr: xhr,
deferred: deferred
});
xhr.done(function (data, textStatus, jqXhr) {
deferred.resolve(data);
})
.fail(function (jqXhr, textStatus, errorThrown) {
deferred.reject(errorThrown);
}).always(function (dataOrjqXhr, textStatus, jqXhrErrorThrown) {
//Once a request has failed or succeeded, remove it from the pending list
pendingRequests.remove(url);
});
return deferred.promise;
}
}]);
})(window.angular);
बाद में आपकी सेवा में जब आप डेटा लोड कर रहे हैं तो आप $ http के बजाय HttpService का उपयोग करेंगे:
(function (angular) {
angular.module('app').service('dataService', ["HttpService", function (httpService) {
this.getResources = function (params) {
return httpService.post('/serverMethod', { param: params });
};
}]);
})(window.angular);
बाद में आपके कोड में आप डेटा लोड करना चाहेंगे:
(function (angular) {
var app = angular.module('app');
app.controller('YourController', ["DataService", "PendingRequestsService", function (httpService, pendingRequestsService) {
dataService
.getResources(params)
.then(function (data) {
// do stuff
});
...
// later that day cancel requests
pendingRequestsService.cancelAll();
}]);
})(window.angular);