开发者问题收集

JavaScript For 循环仅对迭代器的最后一个值执行

2014-09-09
108

我试图从某个网站(比如“website.com”)下载文件。我将所有唯一 ID 放在一个 数组 中。

这是我编写的代码:

for(var i=0;i<ids.length;i++) {
    var timeInterval = 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
        timeInterval = (i+1)*1000;
    })(i,timeInterval);
}

问题在于,它会下载与数组 ids 的最后一个元素相对应的文件,而不是所有文件。
如何让循环对 ids 中的每个元素都起作用?
PS:我尝试了不同相关问题中给出的各种解决方案,但没有一个能带来预期的结果,所以我不得不将其作为另一个问题发布。

1个回答

您正在更新匿名函数末尾的“timeInterval”参数,虽然该语句没有任何问题,但它没有任何好处——它更新的是“timeInterval” 参数 ,而不是循环外的“timeInterval”变量。您可以这样做:

for(var i=0;i<ids.length;i++) {
    var timeInterval = (i + 1) * 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
    })(i,timeInterval);
}

仅在匿名函数之外进行计算。

编辑 ——请注意,您可能仍会遇到问题,具体取决于此代码运行的上下文。浏览器可能不喜欢这种行为。

Pointy
2014-09-09