0

我有一个像这样的通用字典:数据包含一个字典(键,值)对:

for (var key in data) {
  var interval = setInterval(function () { 
    getProgress(key, data[key], interval) }, 2500); // get percent progress every sec.
  }
}

需要为每个数据[key]项执行的getProcess函数

    function getProgress(machineId, operationId, interval) {
        alert(machineId);
        $.post("@Url.Action("Status","Packages")", { 
            machineId: machineId, 
            operationId: operationId 
            }, function (data) {
                if (data) {
                    //blah blah...
                } else { 
                    clearInterval(interval); }
                }
            }
        });
    }

由于某种原因,只有最后一个 machineId 得到了 setInterval。我需要分别为每个数据项设置 setInterval。

4

4 回答 4

3

经典 for 循环范围问题。for 循环的每次迭代都在同一范围内执行,因此在 for 循环内创建的每个函数都访问相同的key变量。

简单的解决方案是为每次迭代创建一个私有范围。

for ( var key in data ) {
    (function (key) {
        var interval = setInterval(function () { 
            // get percent progress every sec.
            getProgress(key, data[key], interval) 
        }, 2500); 
    })(key);
}
于 2012-11-07T16:33:40.247 回答
3

在数据数组上实现 forEach 循环时,我遇到了同样的问题。为了克服这个问题,我简单地实现了 for 循环的基本方法。

for(var key;key<data.length;key++)
{
  var interval = setInterval(function () 
  { 
    // get percent progress every sec.
    getProgress(key, data[key], interval) 
  }, 2500);
}

也喜欢为每次迭代创建私有范围的解决方案。

于 2012-11-07T17:13:50.127 回答
1

您所有的回调都共享同一个key变量。

您需要将代码包装在IIFE中:

for (var dontUse in data) {
    (function(key) {
        var interval = setInterval(function () { getProgress(key, data[key], interval) }, 2500); // get percent progress every sec.
    })(dontUse);
}
于 2012-11-07T16:32:03.590 回答
-1

您应该制作附加功能,以便每次在循环中复制数据和密钥:

function func(key, data)
{
  var interval = setInterval(function () { getProgress(key, data, interval);  }, 2500);
}

for (var key in data) {
  func(key, data);
}

这是因为 setInterval 是异步的

于 2012-11-07T16:32:59.813 回答