基于内循环迭代次数的javascript setInterval的可变间隔

时间:2015-09-08 18:08:11

标签: javascript jquery loops recursion setinterval

我正在尝试在网页上自动执行某些操作,但遇到一些变量setInterval延迟问题。代码根据类名提取元素列表,并迭代每个元素,执行动作,在页面上动态创建新元素,一旦处理集合中的元素,代码应重新拉出类元素并迭代新集合一遍又一遍。

我希望主延迟取决于它从页面中提取的类元素的数量,并每次迭代。此代码将在Chrome中的控制台上运行。

这是我没有可变延迟的原始工作代码:

var finishedActions = [];
var actionDelaySec = 5;
var totActionsInLoop;
setInterval( function() { 
    var pageElementsToActOn = document.getElementsByClassName('classname');
    totActions = pageElementsToActOn.length;
    for(var i =0; i < pageElementsToActOn.length; i++) {
        (function(i){
            window.setTimeout(function(){
                var actionText = pageElementsToActOn[i].textContent;
                if (finishedActions.indexOf(actionText) > -1) {
                    console.log("already finished action");
                } else {
                    finishedActions.push(actionText);
                    console.log(actionText);
                    pageElementsToActOn[i].click();
                }
            }, i * actionDelaySec * 1000);
        }(i));
    }
    console.log("New Loop");
}, 10000);

我第一次尝试将10000数字更改为变量导致崩溃,因为在运行时无法更改setInterval延迟。

经过一些研究后,我认为我可以递归地嵌套我的函数,每次都会以新的延迟调用自己。

此代码也有效,但由于某些原因,每次调用main函数时都不会更改实际延迟,而是将延迟设置为第一次迭代运行的任何延迟:

var finishedActions = [];
var actionDelaySec = 160;
var totActionsInLoop = 5;
var totActionsMade = 0;
var myFunction = function(){
    var pageElementsToActOn = document.getElementsByClassName('classname');
    totActionsInLoop = pageElementsToActOn.length;
    for(var i =0; i < pageElementsToActOn.length; i++) {
        (function(i){
            window.setTimeout(function(){
                var actionText = pageElementsToActOn[i].textContent;
                if (finishedActions.indexOf(actionText) > -1) {
                    console.log("already finished action (" + actionText + ").");
                } else {
                    finishedActions.push(actionText);
                    console.log(actionText + " Connected At: " + timeStamp());
                    totActionsMade++;
                    pageElementsToActOn[i].click();
                }
            }, i * (actionDelaySec * 1000));
        }(i));
    }
    console.log("New Loop -- Actions on page: " + totActionsInLoop + "-- Total actions finished: " + totActionsMade + " -- Started At: " + timeStamp());
    setInterval(myFunction, (totActionsInLoop * (actionDelaySec * 1000)));
};
myFunction();

任何人都可以向我解释为什么延迟不随每个新函数调用而改变,并且可能帮助我修复代码按预期工作?

感谢。

0 个答案:

没有答案