2017-09-20 1 views
1

Je suis en train d'exécuter un timeout de 3 minutes et dans ce timeout je cours une autre fonction à des durées particulières. Mais quand j'essaye d'annuler le timeout c'est encore en cours et le fonction à l'intérieur est toujours obtenir mon code de executed.Here

$scope.time = 180000; 
var timer = function() { 
    if ($scope.time > 0) { 
     $scope.time -= 1000; 
     var durations = [170000, 150000, 130000, 110000, 90000, 70000, 50000, 30000, 10000]; 
     if (durations.includes($scope.time)) { 
      dataService.acceptNotify(payload).then(function(response) { 
       console.log(response); 
       if (response.data.success === true) { 
        $mdToast.showSimple(response.data.msg); 
        $mdDialog.hide(); 
        $timeout.cancel(timeout); 
       } 
      }) 
     } 
     $timeout(timer, 1000); 
    } else { 
     $mdDialog.hide(); 
    } 
} 
var timeout = $timeout(timer, 1000); 
+0

Juste après avoir annulé votre timeout, vous le réglez sans mémoriser sa référence. – dev8080

+0

@ dev8080 J'ai construit un compte à rebours, et je dois appeler ce timeout $ (timer, 1000); à l'intérieur pour continuer à fonctionner –

+1

mais lorsque vous annulez le délai, vous annulez seulement celui en variable 'timeout' pas celui que vous commencez à l'intérieur de la boucle. – dev8080

Répondre

2

Vous ne capturez simplement pas l'instance de temporisateur dans votre variable, donc ne l'annulez pas.

Essayez de changer cette ligne dans votre code:

$timeout(timer, 1000); 

à

timeout = $timeout(timer, 1000); 
0

je crois délai d'attente se passe, mais vous n'êtes pas en mesure de l'observer. Je vois que vous appelez la minuterie de fonction après chaque 1 sec avec ce code

var timeout = $timeout(timer, 1000); 

mais vous annulez après avoir la réponse api et entre-temps, il y aurait eu beaucoup commencé par exemple qui fera appel que beaucoup de temps. donc en fait c'est annulé mais après quelques fois. Par exemple, si vous obtenez une réponse en 20 secondes, elle sera annulée après avoir appelé 20 fois l'API, car votre code est tel. Je peux vous aider avec le bon code si vous me dites ce que vous voulez faire ci-dessus

+0

J'ai un compte à rebours qui compte jusqu'à 0, et entre 3 minutes, j'appelle une API pour observer un événement sur le serveur. Si cet événement arrive avec succès, j'obtiendrai une réponse. succès = vrai, et quand cela arrive, je veux arrêter ce minuteur. Étais-je capable d'expliquer correctement monsieur? –

0

ci-dessous le code suffit de retirer que vous utilisez dessus du bloc d'autre.

$timeout(timer, 1000); 

Cela fonctionnera pour vous.