Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Infinite Loop - Fatal编程技术网

Javascript无止境循环

Javascript无止境循环,javascript,infinite-loop,Javascript,Infinite Loop,此功能在不启动循环的情况下连续运行 setTimeout允许refreshTags函数运行 我肯定这不是最好的剧本——我不是大师——但是你知道为什么这个剧本在无休止的循环中运行吗 function addTag() { console.log('running'); refreshTags(); var t = document.getElementById('existingTags').textContent.match(/tag1/); var u = 'tag1'; if (t

此功能在不启动循环的情况下连续运行

setTimeout允许refreshTags函数运行

我肯定这不是最好的剧本——我不是大师——但是你知道为什么这个剧本在无休止的循环中运行吗

function addTag() 
{
console.log('running'); 
refreshTags(); 
var t = document.getElementById('existingTags').textContent.match(/tag1/); 
var u = 'tag1'; 
if (t == u) {alert('This ticket has already been resolved by our team.')}; 
if (t != u) 
    {
    refreshTags();
    setTimeout(function() 
    {
        document.getElementById('tagToAdd').value = 'tag1';
        document.getElementById('tagSubmit').click(); 
        alert('Ticket resolved!'); 
    }, 2000)
}; 
}
编辑:代码调用下面的addTag

var resolveButton = document.createElement("a");
resolveButton.href = '#';
resolveButton.innerHTML = '<span>Resolve</span>';
resolveButton.setAttribute("onClick", "addTag()");
resolveButton.setAttribute("type", "button");
resolveButton.setAttribute("class", "button1");

var cha = document.getElementById('chatter_view');
cha.parentNode.insertBefore(resolveButton, cha);
var resolveButton=document.createElement(“a”);
resolveButton.href='#';
resolveButton.innerHTML='Resolve';
setAttribute(“onClick”,“addTag()”);
setAttribute(“类型”、“按钮”);
resolveButton.setAttribute(“类”、“按钮1”);
var cha=document.getElementById('chatter_view');
cha.parentNode.insertBefore(resolveButton,cha);

我将尝试回答一个更大的问题“如何防止和调试无限循环?”,而不是试图回答为什么这段代码有一个无限循环

我发现最好的防御方法之一是构造代码,使控制总是朝一个方向流动。这里有许多不同的层:

  • onclick事件处理程序正在调用addTag()
  • addTag()正在调用refreshTags()
  • addTag()正在调用setTimeout,它稍后会触发对DOM的单击
保持代码单向流动的一个简单修复方法是创建专用的事件处理程序,例如
resolvebuttonclick(){addTag()}
。ResolveButtonNonClick仅从resolveButton的onclick处理程序调用。这使得审核代码变得更加容易。您已经在addTag()函数的顶部放置了一个
console.log('running')
。现在,如果您在resolveButtonOnclick()中放置一个console.log(),您将立即知道onclick处理程序是否包含在无限循环中

我们看不到您的代码,但是如果refreshTags()调用addTag(),您将有一个循环控制流——这些并不总是坏的,但是您需要特别小心,它们会在某个点终止

您可能拥有的最大循环控制流是addTag()使用.click()方法回调DOM。直接从Javascript或使用XHR提交表单会更好、更快、更干净


要调试此循环,您需要使用console.log()s找到正确的轨道。添加更多的标签(例如,您调用addTag()的每个位置),并确定从何处调用它。您可以尝试的另一件事是使用Chrome的DevTools:添加一个“调试器;”调用addTag()的顶部并检查堆栈跟踪。

可能是因为这一行模拟了click文档。getElementById('tagSubmit')。click();再一次,请原谅我的无知-为什么这会引起问题?refreshTags函数是什么样子的?它是偶然调用addTag的吗?只是猜测而已。需要查看更多的代码。特别是当您运行add tag函数时。他没有错,如果tagSubmit元素有一个onclick处理程序,该处理程序会再次调用addTag,这可能是一个问题。感谢您深思熟虑的回答,James。我能够在早些时候解决我的问题-请参阅我对原始问题的评论-有两个addTag函数,一个在脚本中,一个(我没有编写)在页面中。我有很多东西要学,我不是一个开发人员,这一点我确信是显而易见的,我从公司的实际开发人员编写的代码中学到了很多东西——所以也许我已经养成了一些坏习惯!)但是,虽然这不是我的日常工作,但学习像这样思考结构化代码的新方法是非常有趣的。再次感谢分享,我将尝试实现这个方法。