我有一个URL数组,我想去每个页面解析一些信息。我愿意:
var numbers = ["1111", "2222", "3333"];
function parse(page){...
}
function set(page){
console.log(page);
window.location = page;
parse (page);
}
for (j=0,m = numbers.length; j<m; j++){
page="http://www.*****/*****/"+numbers[j]+"/*****/";
setInterval(set(page), 10000);
}
但它不起作用,因为浏览器尝试下载页面,最后只显示最后一个页面。函数"parse"不解析页面。如何修复我的代码?
setInterval
将按照您调用它的方式每 10 秒调用一次set
函数。for
循环将在before
那个时候结束,page
在那个时候的值将是:
"http://www.*****/*****/3333/*****/";
因此,10 秒后,您只会看到显示的页面。
尝试将 setTimeout 与递归调用结合使用。
const MAX=100;
setPage(num){
parse()
if(num<MAX)
setTimeout(setPage(num+1), 10000);
}
当你使用setInterval()
时,你只是告诉浏览器在 10 秒后执行set()
函数,并且因为所有的setInterval()
都是在很短的时间内被调用的 for 循环,它们也会一起执行任务,然后 set 将执行三次,首先是"1111"
然后是"2222"
和"3333"
。
似乎它只运行最后一个与"3333"
.
我建议您只使用一次setInterval()
,而page
变量将使用计数器创建。
var counter=0
function count(){
page="http://www.*****/*****/"+numbers[counter]+"/*****/";
set(page);
counter+=1;
if(counter>=numbers.length){
counter=0;
}
}
setInterval(count(), 10000);
这是由于JS中的范围和闭包。该问题的解决方案是在循环中创建 IIFE(立即调用的函数表达式)!
for (var i=1; i<=5; i++) {
page="http://www.*****/*****/"+numbers[j]+"/*****/";
(function(j){
setTimeout( set(page), 10000 );
})( i );
}
如果您有时间,请参考 JS中的闭包!