2010-03-16 7 views
35

Ich habe ein Stück Javascript, das alle n Sekunden nach einer Bedingung (über einen AJAX-Aufruf) sucht. Wenn diese Bedingung zutrifft, hört sie auf zu prüfen. Ich habe es in der folgenden Art und Weise umgesetzt:Ist es OK, clearInterval in einem setInterval-Handler aufzurufen?

var stopTimer; 
var timerId = setInterval(function() { 

    /* Make Ajax Calls and set stopTimer */ 

    if (stopTimer) { 
     clearInterval(timerId); 
    } 
}, 10000); 

Allerdings finde ich erratisches Verhalten: Arbeite manchmal, aber zu anderen Zeiten, es hält die Überprüfung für immer. Ich habe das überprüft (so viel wie möglich), es gibt keinen Fehler in irgendeinem Teil des Codes.

Ich vermute daher, dass der Aufruf von clearInterval in einem SetInterval-Handler der Schuldige sein könnte. Ist das richtig? Ist es OK, clearInterval in einem setInterval-Handler aufzurufen?

Vielen Dank für Ihre Aufmerksamkeit

Antwort

19

Es ist sicher. Das Problem liegt wahrscheinlich daran, dass stopTimer nicht wie erwartet eingestellt ist.

+0

Danke. Wird überprüfen und teilen Ergebnisse –

3

Ich glaube nicht, dass es Probleme mit Ihrem Code geben wird, wenn die AJAX-Funktion nicht fehlerhaft ist. Sie müssen sich um die Erfolgs- und Fehlerrückrufe der AJAX-Funktion kümmern, damit es nicht zu Problemen kommt, wenn die Schleife nicht gestoppt wird.

Auch ich denke, dass Sie ständig den Server für eine Antwort abfragen und dann die entsprechenden Maßnahmen ergreifen. Sie können Reverse AJAX verwenden, um diese Art von Prozess zu tun.

+0

Danke. Ja, es ist möglich, dass die Rundenzeit für den Ajax den Wiederholungsintervall von setInterval stören könnte. Werde das untersuchen und die Ergebnisse teilen –

1

Stellen Sie sicher, dass Sie nicht versehentlich den gleichen Timer-Namen an einer anderen Stelle in Ihrem Code verwenden, was dazu führen würde, dass Sie immer den zweiten Timer stoppen, der definiert wird.

Entweder wird der Timer einen eindeutigen Namen geben, oder Umfang es zu einer Funktion

var timerForAjax = setInterval(function() { 

    /* Make Ajax Calls and set stopTimer */ 

    if (stopTimer) 
    { 
     clearInterval(timerForAjax); 
    } 
}, 10000); 

ich unvorsichtig genug war, meine Timer interval anrufen und wusste nicht, dass ich zwei Timer im gleichen Umfang wurde die Schaffung sowohl genannt interval. Schuld an iOS8 für etwa eine Stunde, bis mir klar wurde, dass that nichts damit zu tun hatte.

+0

Wenn das das ist, was du getan hast, dann würde das erklären, warum es für immer überprüft wurde –

Verwandte Themen