Javascript 如何使for循环在移动到下一个迭代之前等待一个元素

Javascript 如何使for循环在移动到下一个迭代之前等待一个元素,javascript,jquery,for-loop,Javascript,Jquery,For Loop,我有一个带有XPath数组的for循环,它选择按钮元素并在选择框中选择一个选项。对于每个数组项,应该逐个执行此操作。我的代码或多或少可以工作,但如果元素为null,则不会等待option元素。我希望for循环在执行for循环中的其余代码并移动到下一个迭代之前,尝试查找元素,直到找到为止 case = ["xpath1", "xpath2", "xpath3", "xpath4"]; function loopThroughArray(case) { for (var i = 0; i

我有一个带有XPath数组的for循环,它选择按钮元素并在选择框中选择一个选项。对于每个数组项,应该逐个执行此操作。我的代码或多或少可以工作,但如果元素为null,则不会等待option元素。我希望for循环在执行for循环中的其余代码并移动到下一个迭代之前,尝试查找元素,直到找到为止

case = ["xpath1", "xpath2", "xpath3", "xpath4"];

function loopThroughArray(case) {
    for (var i = 0; i <case.length; i++) {
        (function(i) {
            setTimeout(function() {
                //start - getting the corresponding elements and clicking it
                var dt_links = document.evaluate(case[i], document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                var dtLinks = dt_links.snapshotLength;
                if (dtLinks != 0) {
                    for (var a = 0; a < dtLinks; ++a) {
                        dt_links.snapshotItem(a).click();
                    }
                    var ex = document.evaluate("//select/optgroup/option[contains(text(),'new item')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                    var expEl = ex.snapshotItem(0);
                    if (expEl == null) {
                        console.log("new item option is not available");
                    }
                   else{
                    //"new item" option is selected
                    ex.snapshotItem(0).selected = true
                    var exp = $('select')[2] //select box
                    console.log(exp)
                    if ("createEvent" in document) {
                        var evt = document.createEvent("HTMLEvents");
                        evt.initEvent("change", false, true);
                        exp.dispatchEvent(evt);
                    } else {
                        exp.fireEvent("onchange");
                        console.log("change event to be fired");
                    }
               }
                }
            }, 1500 * i);
        })(i);
    };
}
loopThroughArray(case);
case=[“xpath1”、“xpath2”、“xpath3”、“xpath4”];
函数环通通道(案例){

对于(var i=0;i而言,是
SetTimeout
使代码立即返回,从而几乎一次启动所有超时

我相信,通过创建递归函数而不是for循环,您可以实现您想要的:

var recursiveFunc = function(i) {
        setTimeout(function() {
            ...
            if(i < case.lenght - 1){
                 recursiveFunc(i++)
            }
        }, 1500 * i);
    })(0)
var recursiveFunc=函数(i){
setTimeout(函数(){
...
如果(i

编辑根据注释,即使数组太长,似乎也无法耗尽堆栈。

设置超时
使代码立即返回,因此几乎一次启动所有超时

我相信,通过创建递归函数而不是for循环,您可以实现您想要的:

var recursiveFunc = function(i) {
        setTimeout(function() {
            ...
            if(i < case.lenght - 1){
                 recursiveFunc(i++)
            }
        }, 1500 * i);
    })(0)
var recursiveFunc=函数(i){
setTimeout(函数(){
...
如果(i

编辑根据评论,即使数组太长,似乎也无法耗尽堆栈。

通过“选择”您是指用户触发了
change
事件还是以编程方式完成的?很抱歉不清楚,是的,我指的是通过“选择”的特定选项触发change事件你是说用户正在触发<代码>更改事件,还是通过编程方式完成的?很抱歉不清楚,是的,我的意思是使用特定选项触发更改事件SetTimeout基本上是启动一个新堆栈,这样你就不会在这里遇到溢出问题。这很好:)。嗨,pablo,谢谢你的建议,但我仍然得到null elMent,函数没有等待元素很可能是因为您使用保留字
case
作为变量与您的errorsetTimeout基本上是启动一个新堆栈,所以您不会在这里遇到溢出问题。这很好:)。嗨,pablo,谢谢您的建议,但我仍然得到空元素,functionn不是在等待元素。也许您使用保留字
case
作为变量与您的错误有关