Przeglądaj źródła

Added ability to cancel async queries

Andrew Kane 8 lat temu
rodzic
commit
dea735b29c

+ 19 - 3
app/assets/javascripts/blazer/application.js

@@ -25,8 +25,18 @@ $( function () {
   });
 });
 
-function runQuery(data, success, error) {
-  return $.ajax({
+
+
+function cancelQuery(runningQuery) {
+  runningQuery.canceled = true;
+  var xhr = runningQuery.xhr;
+  if (xhr) {
+    xhr.abort();
+  }
+}
+
+function runQuery(data, success, error, runningQuery) {
+  var xhr = $.ajax({
     url: window.runQueriesPath,
     method: "POST",
     data: data,
@@ -36,7 +46,9 @@ function runQuery(data, success, error) {
       var response = $.parseJSON(d);
       data.blazer = response;
       setTimeout( function () {
-        runQuery(data, success, error);
+        if (runningQuery && !runningQuery.canceled) {
+          runQuery(data, success, error, runningQuery);
+        }
       }, 1000);
     } else {
       success(d);
@@ -45,6 +57,10 @@ function runQuery(data, success, error) {
     var message = (typeof errorThrown === "string") ? errorThrown : errorThrown.message;
     error(message);
   });
+  if (runningQuery) {
+    runningQuery.xhr = xhr;
+  }
+  return xhr;
 }
 
 function submitIfCompleted($form) {

+ 6 - 6
app/views/blazer/queries/_form.html.erb

@@ -125,7 +125,7 @@
   editor.focus();
 
   var error_line = null;
-  var xhr;
+  var runningQuery;
   var params = <%= raw blazer_json_escape(variable_params.to_json) %>;
   var previewStatement = <%= raw blazer_json_escape(Hash[Blazer.data_sources.map { |k, v| [k, v.preview_statement] }].to_json) %>;
 
@@ -133,14 +133,12 @@
   function queryDone() {
     $("#run").removeClass("hide")
     $("#cancel").addClass("hide")
-    if (xhr) {
-      xhr.abort()
-    }
   }
 
   $("#cancel").click( function (e) {
     e.preventDefault()
 
+    cancelQuery(runningQuery)
     queryDone()
 
     $("#results").html("")
@@ -161,7 +159,9 @@
 
     var data = $.extend({}, params, {statement: getSQL(), data_source: $("#query_data_source").val()});
 
-    xhr = runQuery(data, function (data) {
+    runningQuery = {};
+
+    runQuery(data, function (data) {
       queryDone()
 
       $("#results").html(data);
@@ -176,7 +176,7 @@
     }, function (data) {
       // TODO show error
       queryDone()
-    });
+    }, runningQuery);
   });
 
   if ($("#query_statement").val() != "") {