几个线程上的JavaScript setInterval

时间:2012-11-07 16:30:46

标签: javascript jquery jquery-selectors

我有一个像这样的通用词典: 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。

4 个答案:

答案 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是异步