Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 间隔结束时使用回调_Javascript_Jquery - Fatal编程技术网

Javascript 间隔结束时使用回调

Javascript 间隔结束时使用回调,javascript,jquery,Javascript,Jquery,我正在制作一个树遍历程序,它使用setInterval设置遍历动画。当setInterval运行时,我想禁用“运行遍历”按钮,这样他们就不能继续运行新的遍历 当遍历完成并且间隔被清除时,我想重新启用按钮。stackoverflow回答建议在间隔结束后使用callback调用enableButtons this.traverseNodes(nodesToDraw、aryList、e.target.id、this.enableButtons) 这很好,但后来我想。。。为什么我需要回电话?我可以在间隔

我正在制作一个树遍历程序,它使用
setInterval
设置遍历动画。当setInterval运行时,我想禁用“运行遍历”按钮,这样他们就不能继续运行新的遍历

当遍历完成并且间隔被清除时,我想重新启用按钮。stackoverflow回答建议在间隔结束后使用callback调用
enableButtons

this.traverseNodes(nodesToDraw、aryList、e.target.id、this.enableButtons)

这很好,但后来我想。。。为什么我需要回电话?我可以在间隔结束后直接调用
启用按钮
,例如:

this.traverseNodes(nodesToDraw、aryList、e.target.id)


因此,我对何时使用回调感到困惑。这里有必要吗?

使用w3schools中的示例:

setInterval(function(){ alert("Hello"); }, 3000);
有关更多示例的链接:
不,没有必要

但是,使用回调将允许您使用同一类在具有不同布局的不同页面上进行树遍历。例如,您可能希望在一个页面上启用/禁用三个按钮,而在另一个页面上仅启用/禁用一个按钮

下面是一个例子:

//首先,我将创建一个假树类来执行工作:
var FakeTree=函数(大小){
这个。大小=大小;
//创建一个伪方法来模拟节点遍历
var_this=这个;
this.TraverseOneNode=函数(){
_this.size=Math.max(_this.size-1,0);
返回(_this.size==0);
}
}
//现在定义遍历的函数
函数遍历节点(树,callbackfn){
var myInterval=window.setInterval(函数(){
if(tree.TraverseOneNode()){
clearInterval(myInterval);
callbackfn();
}
}, 500);
}
//现在为两个按钮集定义回调:
函数按钮\一个\回调(){
//启用按钮1
$(“#按钮1”).removeAttr('disabled');
}
函数按钮\u两个\u回调(){
//启用按钮2和按钮NOK
$(“#按钮2”).removeAttr('disabled');
$('#buttonOK').removeAttr('disabled');
}
//按钮单击功能:
功能按钮\单击一次(){
//禁用按钮一
$('#button1').prop(“disabled”,true);
//调用“TraverseNodes”,向其传递一个大小为5的新FakeTree,以及该按钮的回调
TraverseNodes(新FakeTree(5),按钮(一个)回调);
}
功能按钮两次点击(){
//禁用按钮一
$('#button2').prop(“禁用”,true);
$('#buttonOK').prop(“disabled”,true);
//调用“TraverseNodes”,向其传递一个大小为10的新FakeTree,以及该按钮的回调
TraverseNodes(新FakeTree(10),按钮(两个)回调);
}




你能举个例子吗?好的,我已经添加了一个例子。
api.traverseNodes = function (nodesToDraw, dataStructureList, algType) {
       ...
        var myInterval = setInterval (function() {
            if (i >= nodesToDraw.length-1) {
                self.enableButtons(dsTraversalRunning); //call function to enable buttons
                clearInterval(myInterval);
            }
            ...
setInterval(function(){ alert("Hello"); }, 3000);