0

我已经尝试了几十种不同的解决方案,但都失败了。基本上,我构建了一个数组,其中包含一堆 ID,我使用 javascript 循环遍历它们并打开经过归档过程的页面。这些需要延迟,因为每个发生大约需要一分钟。这是我目前拥有的:

    var i = 0
    function openPage() {
        while (i < Array.length) {
            window.setTimeout(go(i), 60000*i;);
            i++;

        }
    }


    function go(i) {
        window.open('http://localhost:12575/DD7RO2.aspx?id=' + Array[i][0]);
    }

然后我通过按下按钮调用 openPage 。

由于某种原因,这会在 window.setTimeout 行引发“无效参数”错误。我似乎无法弄清楚为什么会这样。我尝试过的所有其他迭代要么打开一个窗口(数组中的第一个窗口)并停止,要么完全无视超时打开所有内容。我觉得这个可能真的有效,因为它实际上在做不同的事情。任何帮助将不胜感激。

4

2 回答 2

3

您正在评估go(i)它何时作为参数传递。该函数在循环中执行。相反,您应该返回一个函数对象,该对象将在计时器触发时执行。

不要这样做function(){go(i);},这是一个典型的关闭错误。go(i)每次触发事件时,您最终都会调用该函数,但具有相同的最终值i。的范围i是封闭函数,所以到超时运行时,它的值将是Array.length - 1.

取而代之的是

window.setTimeout((function (j){return function(j){go(j)}})(i), 60000*i;);

把它拼出来;

(
  function (j) {
    var k = j;
    return function() {
      go(k)
     }
   }
 )(i);

这看起来令人困惑,但这就是 JS 的工作方式。

  1. 它立即执行一个值为 的函数i
  2. 这将返回一个函数对象,但该函数位于一个闭包中,该闭包中的值i在该时间点绑定。
  3. 该函数对象在 timeout 事件触发时执行,且ibound 的值正确。
于 2013-10-23T16:06:19.983 回答
0
window.setTimeout(function(){ go(i); }, 60000*i;);

干得好!

于 2013-10-23T16:05:09.963 回答