Javascript JS:正在尝试将setTimeout与增量值一起使用

Javascript JS:正在尝试将setTimeout与增量值一起使用,javascript,delay,settimeout,intervals,Javascript,Delay,Settimeout,Intervals,我正在尝试在函数调用中使用增量ID在循环上设置一些延迟,以及增量地设置更大的延迟时间。我设置的是这样的: var delay = 0; var delayMilliseconds = 250; timeOutArray = []; for(var i=0; i<100; i++){ delay = i*delayMilliseconds; timeOutArray[i] = setTimeout(function(){ loadRoute(mod

我正在尝试在函数调用中使用增量ID在循环上设置一些延迟,以及增量地设置更大的延迟时间。我设置的是这样的:

var delay = 0;
var delayMilliseconds = 250;
timeOutArray = [];

for(var i=0; i<100; i++){
    delay = i*delayMilliseconds;

    timeOutArray[i] = setTimeout(function(){
            loadRoute(modelsArray[i], (i+1));
        },delay);
}
我遇到的问题是,在调用任何loadRoute函数时,被引用的I已经增加到99

我正在寻找一种方法,让它在设置超时时识别I的数量,而不是在超时发生时识别I的数量

我发现这篇文章是关于使用承诺的,但有点让人困惑。


有人能告诉我如何在这些调用中实现承诺,或者任何不需要将setTimeout代码全部包装在eval中就能实现承诺的方法吗?

将其保存在闭包中以保留原始值

timeOutArray[i] = setTimeout( (function(i) { return function(){
    loadRoute(modelsArray[i], (i+1));
}) (i),delay);
基本上,您在每个循环迭代中创建并执行一个新的匿名函数,并将当前i的副本传递给它。执行时,此函数返回另一个匿名函数,然后将其传递给setTimeout。但是,此函数保留对创建它的作用域的引用,因此可以将i视为外部匿名函数保存的


这有点棘手。您可以在JavaScript中搜索闭包。

或者在for循环之外定义超时函数并调用该函数:

var delay = 0;
var delayMilliseconds = 250;

function doTimeoutStuff(i, delay) {
    setTimeout(function () {
        loadRoute(modelsArray[i], (i+1));
    }, delay);
}

for (var i=0; i<5; i++) {
    delay = i*delayMilliseconds;
    doTimeoutStuff(i, delay);
}

这是代码的工作示例。问题在于对范围和结束的误解

在每次迭代中使用上述函数为每次迭代创建了一个新的范围,这使我们的超时函数有机会为每次迭代关闭一个新的范围,其中有一个变量,其中包含正确的每次迭代值供我们访问


setTimeout不创建闭包,而是允许您在执行时将要传递给回调函数的变量传递给回调函数,然后回调函数将在回调过程中一直存在

setTimeoutfunction[,delay,arg1,arg2,…]


来源:

谢谢你的帮助。实际上,我在这一行代码中得到了一个语法错误:}I,delay;语法错误:缺少;在陈述之前,非常感谢。这在代码的现有上下文中解决了我的问题。另外,很高兴知道我需要研究范围和结束。如果它有帮助,那么请接受答案,它可能会帮助其他用户。
var delay = 0;
var delayMilliseconds = 250;
timeOutArray = [];

for (var i=1; i<100; i++) {
    (function(j){
        delay = j*delayMilliseconds;
        timeOutArray[j] = setTimeout(function(){
            console.log(j)
            //loadRoute(modelsArray[j], (j+1));
        },delay);
    })( i );
}
(function(j){
 //this part of the code create new scope
})( i );