JavaScript递归函数中的settimeout用法?

3
function theFunction(a){
    var newNum = a+1;
    var iframe = document.createElement("iframe");
    var currURL = urlArray[a];
    iframe.src = currURL;
    iframe.frameBorder = "0";
    iframe.height = "0";
    iframe.width = "0";

iframe.onload = function(){
    document.getElementById('number').innerHTML = a;
};
    var arrayLength = someArray.length;

    if(a != arrayLength){
     theFunction(newNum);
     }
}

这是我的基本函数,它通过一个数组进行递归。无论如何,在执行过程中(在 //do nothing 部分),有时会卡住,我希望在 2 秒后超时并继续执行下一个。是否可以实现这一点,还是我必须完全停止该函数?
编辑:设置超时可能不是我要找的,但需要某种方法来停止该函数并转到下一个。
编辑2:代码已添加

你到底想要发生什么?在进行下一次递归调用之前,让你的函数“暂停”2秒钟? - Nightfirecat
理想情况下,我希望它能正常运行,但如果它注意到函数运行时间超过2秒,它会跳过下一个迭代。 - Calvin
是的,在被注释的部分,它正在加载外部页面。通常情况下(95%的时间)它会在几分之一秒内加载并很好地工作,但有时它会发现一个加载缓慢/大文件/丢失/其他问题的页面,可能需要更长时间来加载。对于这些页面,我希望它可以跳过并继续执行。 - Calvin
好的,那肯定是你想要解决问题的地方。如果你能更新代码并添加外部页面加载部分,我相信我们可以更进一步地帮助你。 - anson
@andbeyond 我更新了代码。现在它只是加载URL的不可见iframe。(基本上我需要加载URL来在每个页面上运行脚本,它们是php/js/asp...)。 - Calvin
显示剩余5条评论
2个回答

1

嗯,你知道它“卡住”时到底发生了什么吗?因为如果“卡住”意味着进入循环或其他错误,那么setTimeout是无法帮助你的。根据我的经验,使用setTimeout设置执行代码将在给定的延迟时间过去后或其他代码停止执行时发生,以最后发生的为准。换句话说,我认为你不能用setTimeout打断当前正在运行的代码,这似乎是你所要求的。

我知道这有点不是正解;我建议先确定“卡住”的性质。


是的,setTimeout可能不是我正在寻找的东西。只是需要一种停止当前函数并转移到下一个函数的方法。至于它被卡住的原因,在注释部分期间,它正在加载外部页面。通常(95%的时间)它可以在几分之一秒钟内加载并且完美地工作,但有时它会发现加载速度较慢/文件较大/缺失/等等的页面,可能需要更长时间来加载。对于这些页面,我希望它只是跳过并继续执行下一个函数。 - Calvin
考虑周到地处理XMLHttpRequest对象可能会很有帮助。框架(例如jQuery)在这方面已经进行了封装,通常只能让您在ajax调用返回时执行回调。如果您直接监控XMLHttpRequest对象,则可能能够娴熟地处理此类问题。不过,我从未尝试过。 - Chris

0
你可以尝试使用iframe.contentDocument.readyState,但我不太自信地说“尝试”,因为在我的测试中,它总是处于“完全”状态,但可能当你遇到一些加载时间较长的页面时,它们可能会停留在某些先前的状态。
要了解更多关于此的信息和不同状态,请查看此链接。

http://msdn.microsoft.com/en-us/library/ms534358%28v=vs.85%29.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接