|
|
@@ -94,6 +94,21 @@ export class BackendSrv {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ addCanceler(requestId, canceler) {
|
|
|
+ if (requestId in this.inFlightRequests) {
|
|
|
+ this.inFlightRequests[requestId].push(canceler);
|
|
|
+ } else {
|
|
|
+ this.inFlightRequests[requestId] = [canceler];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ resolveCancelerIfExists(requestId) {
|
|
|
+ var cancelers = this.inFlightRequests[requestId];
|
|
|
+ if (!_.isUndefined(cancelers) && cancelers.length) {
|
|
|
+ cancelers[0].resolve();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
datasourceRequest(options) {
|
|
|
options.retry = options.retry || 0;
|
|
|
|
|
|
@@ -101,16 +116,13 @@ export class BackendSrv {
|
|
|
// particular query. If the requestID exists, the promise it is keyed to
|
|
|
// is canceled, canceling the previous datasource request if it is still
|
|
|
// in-flight.
|
|
|
- var canceler;
|
|
|
- if (options.requestId) {
|
|
|
- canceler = this.inFlightRequests[options.requestId];
|
|
|
- if (canceler) {
|
|
|
- canceler.resolve();
|
|
|
- }
|
|
|
+ var requestId = options.requestId;
|
|
|
+ if (requestId) {
|
|
|
+ this.resolveCancelerIfExists(requestId);
|
|
|
// create new canceler
|
|
|
- canceler = this.$q.defer();
|
|
|
+ var canceler = this.$q.defer();
|
|
|
options.timeout = canceler.promise;
|
|
|
- this.inFlightRequests[options.requestId] = canceler;
|
|
|
+ this.addCanceler(requestId, canceler);
|
|
|
}
|
|
|
|
|
|
var requestIsLocal = options.url.indexOf('/') === 0;
|
|
|
@@ -158,7 +170,7 @@ export class BackendSrv {
|
|
|
}).finally(() => {
|
|
|
// clean up
|
|
|
if (options.requestId) {
|
|
|
- delete this.inFlightRequests[options.requestId];
|
|
|
+ this.inFlightRequests[options.requestId].shift();
|
|
|
}
|
|
|
});
|
|
|
};
|