2017-12-29 15 views
0

I, in denen ein Quiz-Typ App mache, wenn der Benutzer eine Frage bekommt, geht ein Timer von 10 Sekunden wie folgt aus:

$scope.timer2 = function() { 
    setTimeout(function() { 
     console.log('times up!!!!'); 
    }, 10000) 
} 

und es wird aufgerufen wird, wenn eine Frage wie diese kommt:

timerHandle = setTimeout($scope.timer2()); 

und nach dieser timer2 Ausführung eine andere Frage erscheint und so weiter, eine andere Art und Weise der Frage nach oben geknallt wird, ist, dass der Benutzer auch eine Option wählt dann eine neue Frage kommt auf. So weit so gut, aber das Problem ist, dass, wenn angenommen wird, dass 5 Sekunden vergangen sind und dann der Benutzer eine Option auswählt, zeigt "timer2" immer noch "mal hoch !!" nach 5 weiteren Sekunden und ein weiterer Timer für die neue Frage zeigt auch "mal hoch !!" wenn der Benutzer keine Option ausgewählt hat.

Was ich versuche zu sagen ist, dass ich möchte, dass die timer2 zu stoppen, wenn der Benutzer eine Option auswählt, und dann möchte ich wieder diesen Timer aufgerufen werden, da eine neue Frage eintreffen wird. Dies ist der Winkel-Code, der ausgeführt wird, wenn Benutzer eine Option wählt: -

$scope.checkanswer=function(optionchoosed){ 
      $http.get('/quiz/checkanswer?optionchoosed='+ optionchoosed).then(function(res){ 
       if(res.data=="correct"){ 
        $scope.flag1=true; 
        $scope.flag2=false; 

       }else{ 
        $scope.flag2=true; 
        $scope.flag1=false; 
       } 
       $http.get('/quiz/getquestions').then(function(res){ 
       console.log("respo"); 
       $scope.questions=res.data; 
       clearTimeout($scope.timerHandle); //not working 
       timerHandle = setTimeout($scope.timer2()); 
+0

ich bearbeiten Ihre Frage, weil sie AngularJS gefragt, aber das Problem ist wirklich generical. –

+0

ja lol danke dafür. – Asim

Antwort

2

Sie können versuchen, den Dienst von AngularJS $timeout verwenden. Dann etwas in dieser Richtung tun:

var myTimer = $timeout(function(){ 
       console.log("hello world") 
      }, 5000); 

    .... 
$timeout.cancel(myTimer); 
+0

Vielen Dank :) Ich weiß immer noch nicht, was die Ursache war, aber es funktionierte wie ein Zauber. – Asim

+0

Froh, dass es geholfen hat :) – Nat

+2

AngularJS modifiziert den normalen JavaScript-Fluss, indem sie eine eigene Ereignisverarbeitungsschleife bereitstellt. Dies teilt das JavaScript in den klassischen und den AngularJS-Ausführungskontext auf. Nur Operationen, die im AngularJS-Ausführungskontext angewendet werden, profitieren von der AngularJS-Datenbindung, der Ausnahmebehandlung, der Überwachung von Eigenschaften usw. Das [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout) Service ist der AngularJS-Wrapper für 'setTimeout'. – georgeawg

1

für setTimeout an der MDN-Dokumentation einen Blick.
Wie Sie sehen können, gibt diese Funktion einen eindeutigen Bezeichner zurück. An dieser Stelle können Sie clearTimeout beiläufig, dass UID als Parameter aufrufen:

let myTimeout = setTimeout(myFunction, millis); //Start a timeout for function myFunction with millis delay. 
clearTimeout(myTimeout); //Cancel the timeout before the function myFunction is called. 
+0

Ich benutze clearTimeout (timerHandle) oben, aber die Funktion stoppt nicht. Es wurde schon vorher angerufen, hört aber nicht auf. – Asim

+0

Das Problem ist, dass Sie timerHandle direkt nach dem Aufruf von clearTimeout (timerHandle) festlegen. –

+0

aber dann sollte es wieder die erste stoppen und dann die zweite ausführen, na? – Asim

0

Da Sie bieten nicht funktionierendes Beispiel mir die beste Vermutung tun lassen. Ihre Funktion gibt kein Handle aus dem inneren setTimeout zurück, so dass sie nicht abgebrochen werden kann. Was über solche Änderungen:

$scope.timer2 = function() { 
    return setTimeout(function() { // added return statement 
     console.log('times up!!!!'); 
    }, 10000) 
} 

und dann

timerHandle = $scope.timer2(); // simply call timer2 that returns handle to inner setTimeout 
Verwandte Themen