Browse Source

Fix requests cancelling (#7457)

* fix backendSrv request cancelling

* revert imports

* formatting
jifwin 9 years ago
parent
commit
9e7df648b5
1 changed files with 21 additions and 9 deletions
  1. 21 9
      public/app/core/services/backend_srv.ts

+ 21 - 9
public/app/core/services/backend_srv.ts

@@ -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();
       }
     });
   };