2016-04-14 9 views
0

ich eine AJAX-Anforderung haben, die wie folgt aussieht:Töte eine sich wiederholende AJAX-Request

var statistics = "link-to-a-JSONP"; 

function team_stats(json) { 
    alert(json); 
} 

(function stats() { 
     $.ajax({ 
      type: 'GET', 
      url: statistics + '?callback=jsonp', 
      crossDomain: true, 
      dataType: 'jsonp', 
      jsonpCallback: 'team_stats', 
      jsonp: 'callback', 
      data: {}, 
      success: function(data) { 
       var test += '<div>' + data + '</div>'; 
       $(".content").append(test); 

       /* a close button that closes the tab and kills the request */ 
       $("#closeStats").on("click", function() { 
        stats.abort(); 
       }); 
      }, 
      complete: function() { 
       setTimeout(stats, 15000); 
      } 
     }); 
})(); 

Dies funktioniert gut und die Anforderung wiederholt sich alle 15 Sekunden. Jetzt möchte ich die Anfrage beenden, wenn ich auf eine bestimmte Schaltfläche klicke (wie abgebildet). Der Compiler sagt, dass das Fragment stats.abort() keine Funktion ist und die Schleife fortsetzt.

Irgendwelche Ideen?

+0

Ich nehme an, Sie haben stats.abort() irgendwo definiert. Versuchen Sie, den Code zum Anfügen des Klickereignisses an #closeStats außerhalb der Statistikfunktion zu verschieben. Ich bin mir ziemlich sicher, dass du das nur einmal anhängen willst (nicht jedes Mal, wenn der Ajax-Aufruf erfolgreich ist) und ihm Zugriff auf den richtigen Inhalt für stats.abort() geben soll. –

+0

Was ist "stats"? Wenn NICHTS mit dem Ajax-Aufruf zu tun hat, ist es eine Funktion. – epascarello

+0

stats ist der Name der Funktion, die meine AJAX-Anfrage definiert. Es wird erfolgreich innerhalb von complete aufgerufen und als Teil von setTimeout gesetzt, daher verstehe ich nicht, warum es nicht auch innerhalb des Erfolgs aufgerufen werden kann. – webbul

Antwort

3

Sie rufen Abbruch einer Funktion auf. Funktionen müssen nicht abgebrochen werden.

Sie möchten das setTimeout beenden. Sie müssen also einen Verweis auf den Timer halten.

(function() { 
    var timer; 
    function foo() { 
     console.log(new Date()); 
     timer = window.setTimeout(foo,1000); //<-- store a reference to the timeout 
    } 

    function killTimer() { 
     if (timer) window.clearTimeout(timer); 
    } 

}()); 

Wenn Sie auch eine aktive Ajax-Anfrage abbrechen möchten, müssen Sie auch einen Verweis darauf halten.

xhr = $.ajax(...); 
... 
xhr.abort(); 
+0

Das ist absolut richtig! Ich wusste, dass ich etwas falsch gemacht habe. Also muss ich stattdessen die Auszeit töten ... Vielen Dank :) – webbul

Verwandte Themen