javascript - 我可以在另一个 setTimeout 的处理程序中有一个 setTimeout 吗?

标签 javascript settimeout

这是一个快速的(损坏的)jsfiddle:http://jsfiddle.net/wH2qF/

由于某种原因这不起作用...是因为我在另一个 setTimeout 的处理程序中有一个 setTimeout 吗?

$(function() {
   $("#Volume").click(function() {
      setTimeout(triggerVolumeChange, 4000);
      function triggerVolumeChange() 
      {
          var volumeDiv = document.getElementById("volumeNumber");
          var volumeOld = 8;
          var volumeNew = 37;
          var timeNew = (1000/(volumeNew-volumeOld));
          changeVolume();
                        
          function changeVolume()
          {
             volumeDiv.innerHTML = volumeOld;
             volumeOld++;
             if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew);
          };
      });
});

应该说明,为了清楚起见,我从该 Click 函数中删除了其他内容,并澄清哪些内容不完全有效,嗯,基本上,我点击但没有任何反应,而如果我删除这段代码,它就可以正常工作很好......实际上 vars 的设置也可以正常工作(我自然认为)但是当我粘贴或取消注释 changeVolume() 函数时,点击再次停止工作......有什么想法吗?

--

另一个澄清:我想做的是,在点击时,模拟从值 8 到 37 的音量,在一个字符串中......因此是该函数中的 setTimeout。

--

根据你的人的要求,这是完整的代码......我怀疑它是否有意义,但它是......仅供引用,点击它会触发一些动画来模拟应用程序的流程我'米设计..

<script>
            $(function() {
                $("#Volume").click(function() {
                                        
                    var userPrompt = document.getElementById("userPrompt")
                    userPrompt.innerHTML = "Change volume to 37";
                                        
                    var avatarIcon = document.getElementById("avatarIcon");
                    avatarIcon.innerHTML = "<img src='imgs/haloIcons-volume_82x76.png' alt='Volume'/>";
                
                    var hints = document.getElementById("hints");
                    hints.style.opacity = 0;
                    $(".dragonTvOut").toggleClass("dragonTvIn");
                    
                    setTimeout(triggerP, 1000);
                    function triggerP()
                    {
                        var halo = document.getElementById('avatar');
                        if( 'process' in halo ) { 
                            halo.process();
                        };
                    };
                    
                    setTimeout(triggerUserPrompt, 2000);
                    function triggerUserPrompt() 
                    {
                        document.getElementById("userPrompt").className = "userPromptIn";
                    };
                    
                    setTimeout(triggerVolumeChange, 4000);
                    function triggerVolumeChange() 
                    {
                        document.getElementById("userPrompt").className = "userPromptEnd";
                        
                        var halo = document.getElementById('avatar');
                        if( 'resume' in halo ) { 
                            halo.resume();
                        }

                        document.getElementById("avatarIcon").className = "avatarIconEnd";
                        
                        var volumeDiv = document.getElementById("volumeNumber");
                        var volumeOld = 8;
                        var volumeNew = 37;
                        var timeNew = (1000/(volumeNew-volumeOld));
                        changeVolume();
                        
                        function changeVolume()
                        {
                            volumeDiv.innerHTML = volumeOld;
                            volumeOld++;
                            if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew);
                        }​;
                        
                        var side = 100;
                        var paper = new Raphael(volumeArcAnim, 100, 300);
                        
                        paper.customAttributes.arc = function (xloc, yloc, value, total, R) {

                            var alpha = 360 / total * value,
                                a = (90 - alpha) * Math.PI / 180,
                                x = xloc + R * Math.cos(a),
                                y = yloc - R * Math.sin(a),
                                path;
                            if (total == value) {
                                path = [
                                    ["M", xloc, yloc - R],
                                    ["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R]
                                ];
                            } else {
                                path = [
                                    ["M", xloc, yloc - R],
                                    ["A", R, R, 0, +(alpha > 180), 1, x, y]
                                ];
                            }
                            return {
                                path: path
                            };
                        };
                    
                        var arcWidth = 87;
                        var strokeRadius = arcWidth/2;
                        
                        var indicatorArc = paper.path().attr({
                            "stroke": "#ffffff",
                            "stroke-width": 3,
                            arc: [side/2, side/2, 12, 100, strokeRadius]
                        });
                        
                        indicatorArc.animate({
                            arc: [side/2, side/2, 60, 100, strokeRadius]
                        }, 1500, "<>", function(){
                            // anim complete here
                        });
                        
                    };
                                            
                });
            });
            </script>

最佳答案

是的,您可以在另一个内部设置一个 setTimeout() -- 这是用于重复定时事件的典型机制。

你的不工作的原因与 setTimeout() 本身无关;这与您嵌套函数的方式有关。

changeVolume() 函数位于 triggerVolumeChange() 中,这意味着您不能直接使用它的名称来引用它。

最快的解决方案是移除嵌套,这样 changeVolume() 就位于根级别,而不是嵌套在 triggerVolumeChange() 中。

关于javascript - 我可以在另一个 setTimeout 的处理程序中有一个 setTimeout 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887186/

相关文章:

javascript - 如何在此函数中获取 'this' ?

javascript - 如何使用 webpack 4 在 javascript 文件中模板化变量

javascript - 似乎无法将函数传递给node.js(TypeScript)中的setTimeout参数数组

javascript - 在 promise 链上使用 setTimeout

javascript - AngularJS ng-repeat orderby 无法正确处理希腊单词

javascript - 动画 HTML 文本更改 jQuery

javascript - 在特定位置添加创建的元素

javascript - Promise 对象内的 setTimeout

javascript - 使用 javascript setTimeout 来查看 div 是否已加载

javascript - 使用 setInterval 隐藏和显示循环