我有一个像这样的通用词典: data包含字典(键,值)对:
for (var key in data) {
var interval = setInterval(function () {
getProgress(key, data[key], interval) }, 2500); // get percent progress every sec.
}
}
需要为EACH数据[key] item
执行的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。
答案 0 :(得分:3)
经典的循环范围问题。 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);
}
答案 1 :(得分: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);
}
也像为每次迭代创建私有范围的解决方案。
答案 2 :(得分: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);
}
答案 3 :(得分:-1)
您应该创建附加功能,以便每次在循环中复制数据和密钥:
function func(key, data)
{
var interval = setInterval(function () { getProgress(key, data, interval); }, 2500);
}
for (var key in data) {
func(key, data);
}
这是因为setInterval是异步