2016-07-11 7 views
1

Ich versuche AJAX zu benutzen, sagen wir alle 5 Sekunden und dann den gesamten Ajax-Ruf nach 60 Sekunden, damit es keinen Ajax-Anruf alle 5 Sekunden gibt, nachdem wir die 60 Sekunden erreicht haben.jQuery: Führen Sie AJAX alle X Sekunden für nur 60 Sekunden?

Ich bin mir nicht sicher, ob das überhaupt möglich ist!

Ich kann einfach meine Ajax alle 5 Sekunden wie so läuft:

setInterval(function(){ 

$.ajax({url: 'PHP-PAGE.php', success: function(result){ 

    }}); 

    }, 5000); 

Gibt es eine Möglichkeit die 60 Sekunden Countdown innerhalb der Ajax und stoppen den ganzen Ajax-Aufruf zu starten, nachdem wir die 60 Sekunden erreicht?

Jede Hilfe wäre willkommen.

Antwort

-1

Überprüfen Sie den Code unten :)

for(var i = 1; i < 61; i++) { 
    setTimeout(function(){ 
    console.log('#afucntionthatrunseverysecondinoneminute') 
    },1000*i); 
} 
+1

Dies ist ineffizient denke ich, und speicherintensiv, weil Sie den Browser sind gefragt 60 Prozesse auf einmal zu verfolgen, wenn 1 oder 2 verwendet werden könnten, die lösen Problem. – BeetleJuice

+0

0.724 ms in meinem Browser – Arif

+0

@Guti auch so, es ist nicht gute Praxis – Alnitak

7

Erfassen der Prozess-ID aus dem eingestellten Intervall

var intervalID = setInterval(..., 5000) 

dann sofort ein Timeout, dass das Intervall in 60 Sekunden

setTimeout(function(){clearInterval(intervalID)},60000) 
annullieren
2
var start = new Date().getTime(); 
var interval = setInterval(function() { 
    if(new Date().getTime() - start > 60000) { // 60 seconds 
     clearInterval(interval) 
     interval =null; 
     return; 
    } 
    $.ajax({url: 'PHP-PAGE.php', success: function(result){ 
     ... 
    }}); 
}, 5000); 
+2

Bitte formatieren Sie Ihren Code - anders als das ich denke, das ist eine bessere Lösung als die (derzeit) höher gewählt, weil es die tatsächliche Zeit in gewisser Weise berücksichtigt das 'setInterval' manchmal nicht. – Alnitak

+0

@Alnitak könnten Sie herausfinden, was das Ihrer Meinung nach besser macht? Ich bin mir nicht sicher, ob ich Ihren Punkt verstehe, weil beide Lösungen 'setInterval' verwenden, um den Ajax auszulösen. – BeetleJuice

+0

@BeetleJuice 'setInterval'-Ereignisse können in die Warteschlange eingereiht werden (z. B. wenn der Browser beschäftigt ist) und dann werden die Ereignisse auf einmal freigegeben. Die Überprüfung der verstrichenen Zeit stellt sicher, dass die primäre Einschränkung "Nichts passiert nach 60 Sekunden" eingehalten wird. – Alnitak

0

Sie sollten t hinzufügen ime Zähler

var timeCounter= 0; 

und dann prüfen, ob es über 60s in Ihrem setInterval Anruf

var interval = setInterval(function() { 
    timeCounter += 5; 
    if (timeCounter > 60) { 
     clearInterval(interval); 

    } else { 
     $.ajax({url: 'PHP-PAGE.php', success: function(result){ 

     }}); 
    } 
}, 5000); 
+0

Interessante Lösung. Sollte das "timeCounter" -Inkrement nicht zu Beginn auftreten? Wie die Dinge sind, Wenn die verstrichene Zeit 65 Sekunden ist, wird die Prüfung "if (timeCounter> 60)" fehlschlagen, weil der Zähler gleich 60 (von der vorherigen Funktionsaufruf) – BeetleJuice

+0

Es sollte, sorry :) –

-2

Versuchen Sie dieses heraus

var interval = setInterval(function() { 
//Call your ajax function which has another setInterval running after 5sec duration. 
       ajax_fun(); 
       clearInterval(interval); 
     }, 60000); 
+1

OP will die Ajax um alle 5 Sekunden zu laufen. Dies wird einmal in 36 Sekunden ausgeführt, denke ich. – BeetleJuice

+0

Ja sicherlich wird es einmal in 36 Sekunden laufen, was ein Tippfehler war !! Eigentlich ist das 36000 60000 und abgesehen davon bemerkt man die ajax_fun() innerhalb der eingestellten Intervallfunktion. Diese ajax_fun() enthält eine weitere Intervallfunktion, die alle 5 Sekunden ausgeführt wird und den Ajax-Aufruf ausführt. Ich habe diesen Teil übersprungen, denn @Jackson hat das schon in Frage gestellt. Hoffe, die Dinge sind jetzt klar –

+0

@ DeepakSingh nicht im entferntesten klar - in jedem Fall (kein Wortspiel beabsichtigt), wenn dies ein One-Shot-Timer sein soll, sollte es 'setTimeout' und nicht' setInterval' verwenden – Alnitak

1

Im Allgemeinen ist es eine schlechte Praxis ist asynchron auszuführen ruft innerhalb einer setInterval Funktion auf. Stattdessen könnten Sie die gleiche Funktion ausführen davon Rückruf ist, nach einem Timeout :

Beispiel

prüfen diese Fiddle für ein funktionierendes Beispiel.


EDIT (zugegebene Reaktionszeitberechnung)

// Start a counter 
var i = 0; 
var start = setInterval(function() { i++; }, 1000); 

var ajaxCall = function() { 

    // Set the start time 
    var startAjaxRequest = new Date().getTime(); 

    // Execute ajax call 
    $.ajax({url: 'PHP-PAGE.php', success: function(result){ 

     // Get the ajax response time in ms 
     var ajaxResponseTime = new Date().getTime() - startAjaxRequest; 

     if (i < 60 && ajaxResponseTime < 5000) { 

     // Execute the same ajax call after 5 seconds minus ajax response time 
     setTimeout(ajaxCall, 5000 - ajaxResponseTime); 

     } else { 

     clearInterval(start); 

     } 
    }}); 
} 
+0

Ich stimme dem Prinzip der Verwendung von 'setTimeout' in einer Schleife anstelle von 'setInterval' zu, aber warum dann einen separaten Zähler verwenden, um die verstrichene Zeit zu messen ?! – Alnitak

+0

p.s. Sie sollten auch 'setTimeout (ajaxCall, 5000)' ohne die zusätzliche anonyme Funktion wrapper – Alnitak

+0

Dies erfüllt nicht die OP-Anforderung "Ich versuche, AJAX für sagen wir alle 5 Sekunden ausführen". Der Ajax-Aufruf in dieser Lösung wird nicht in einem vorhersehbaren Zeitplan ausgelöst. Übrigens bin ich interessiert. Warum ist es eine schlechte Methode, asynchrone Aufrufe innerhalb eines 'setInterval' auszuführen? – BeetleJuice

0

ich einen einfachste Weg gefunden. Mai für Sie hilfreich:

\t $(function() { 
 
\t var tick = 1; 
 
\t setInterval(function() { 
 
\t \t if (tick <= 12) { // set how much times that you want to repeat 
 
\t \t $.ajax({ 
 
\t \t \t url: 'http://date.jsontest.com', 
 
\t \t \t success: function(result) { 
 
\t \t \t $('pre').append('hi ' + tick + '</br>'); 
 
\t \t \t tick = tick + 1; 
 
\t \t \t } 
 
\t \t }); 
 
\t \t } 
 
\t }, 5000); // interval time 
 
\t });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<pre> 
 
</pre>

+0

Interessant. Ich bin mir nicht sicher, ob es einer der Anforderungen entspricht. Das OP schrieb: "Es wird keinen Ajax-Ruf geben ... nachdem wir die 60 Sekunden erreicht haben.Msgstr "" "Durch Erhöhen des" Ticks "im" onSuccess "- Callback verlieren Sie die Kontrolle darüber, ob das Häkchen tatsächlich die Zeit hält. Wenn ein Anruf nach etwa 55 Sekunden eine Weile dauert und 5 Sekunden verstreichen, wird der Tick nicht erhöht 'Zeit und ein weiterer Anruf wird über die 60 Sekunden Grenze – BeetleJuice

+0

@BeetleJuice ja gemacht werden.Ich stimme auch mit Ihrem Punkt.Wenn OP keine Ajax-Anrufe nach 60. Sekunde ausführen will, dann wird diese Methode nicht hilfreich sein OP. Wenn OP 12 Ajax-Anfragen machen will, dh '12 * 5 = 60' Sekunden, dann kann er das verwenden. – Ravimallya

+0

Downvoters sollten einen Kommentar hinterlassen, warum die Antwort abgelehnt wird. – Ravimallya

Verwandte Themen