Javascript 停止AngularJS中的setTimeout函数(提示:使用$timeout)

Javascript 停止AngularJS中的setTimeout函数(提示:使用$timeout),javascript,angularjs,timer,settimeout,Javascript,Angularjs,Timer,Settimeout,我正在制作一个问答类应用程序,当用户收到一个问题时,10秒的计时器如下所示: $scope.timer2 = function() { setTimeout(function() { console.log('times up!!!!'); }, 10000) } timerHandle = setTimeout($scope.timer2()); 当这样一个问题出现时,它被称为: $scope.timer2 = function() { setTim

我正在制作一个问答类应用程序,当用户收到一个问题时,10秒的计时器如下所示:

$scope.timer2 = function() {
    setTimeout(function() {
        console.log('times up!!!!');
    }, 10000)
}
timerHandle = setTimeout($scope.timer2());
当这样一个问题出现时,它被称为:

$scope.timer2 = function() {
    setTimeout(function() {
        console.log('times up!!!!');
    }, 10000)
}
timerHandle = setTimeout($scope.timer2());
在执行完这个
timer2
后,会弹出另一个问题,以此类推,弹出问题的另一种方式是用户选择一个选项,然后会出现一个新问题。到目前为止还不错,但问题是,如果用户选择了一个选项,5秒后“timer2”仍然显示“times up!!”,如果用户没有选择任何选项,新问题的另一个计时器也会显示“times up!!”

我想说的是,我希望当用户选择任何选项时,
timer2
停止,然后我希望再次调用此计时器,因为新问题将出现。 这是用户选择选项时执行的角度代码:-

 $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());

请查看有关的MDN文档。
如您所见,该函数返回一个唯一标识符。 此时,您可以调用将该UID作为参数传递:

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.

请查看有关的MDN文档。
如您所见,该函数返回一个唯一标识符。 此时,您可以调用将该UID作为参数传递:

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.

您可以尝试使用AngularJS的服务。 然后按照以下思路做一些事情:

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

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

您可以尝试使用AngularJS的服务。 然后按照以下思路做一些事情:

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

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

由于您没有提供工作示例,让我做最好的猜测。函数不会从内部
setTimeout
返回句柄,因此无法取消。那么这些修改呢:

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

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

由于您没有提供工作示例,让我做最好的猜测。函数不会从内部
setTimeout
返回句柄,因此无法取消。那么这些修改呢:

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

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

我编辑了你的问题,因为你要求AngularJS,但是你的问题非常一般。是的,谢谢。我编辑了你的问题,因为你要求AngularJS,但是你的问题非常一般。是的,谢谢。我正在使用上面的clearTimeout(timerHandle),但是函数没有停止。它以前被调用过,但没有停止。问题是您在调用clearTimeout(timerHandle)之后设置了timerHandle。但是它应该停止第一个,然后执行第二个,对吗?你能看看控制台并告诉我最终的错误吗?我对clearTimeout的调用表示怀疑:首先,timerHandle从未设置过。这会导致一个错误。Lol控制台中没有错误。正在设置计时器,并在10秒后打印“times up!”。我正在使用上面的clearTimeout(timerHandle),但函数没有停止。它以前被调用过,但没有停止。问题是您在调用clearTimeout(timerHandle)之后设置了timerHandle。但是它应该停止第一个,然后执行第二个,对吗?你能看看控制台并告诉我最终的错误吗?我对clearTimeout的调用表示怀疑:首先,timerHandle从未设置过。这会导致一个错误。哈哈,控制台中没有错误。正在设置计时器,并在10秒后打印“times up!”。非常感谢:)我仍然不知道原因是什么,但它工作起来很有魅力。很高兴它有帮助:)AngularJS通过提供自己的事件处理循环修改了正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才能从AngularJS数据绑定、异常处理、属性监视、,等等。该服务是
setTimeout
的AngularJS包装。非常感谢:)我仍然不知道原因是什么,但它工作起来很有魅力。很高兴它有帮助:)AngularJS通过提供自己的事件处理循环修改了正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定、异常处理、属性监视等。该服务是
setTimeout
的AngularJS包装。